home *** CD-ROM | disk | FTP | other *** search
/ PC World 2008 September / PCWorld_2008-09_cd.bin / v cisle / sadanastroju / delicious_bookmarks-2.0.64-fx.xpi / chrome / deliciousBookmarks.jar / content / ybookmarksOverlay.js < prev    next >
Encoding:
Text File  |  2008-06-19  |  128.6 KB  |  3,268 lines

  1. var gYBRdfService     = Components.classes["@mozilla.org/rdf/rdf-service;1"].
  2.                                 getService(Components.interfaces.nsIRDFService);
  3. var  gYBrscName       = gYBRdfService.GetResource( "http://home.netscape.com/NC-rdf#Name" );
  4. var  gYBrscGenTitle   = gYBRdfService.GetResource( "http://home.netscape.com/NC-rdf#GeneratedTitle" );
  5. var  gYBrscUrl        = gYBRdfService.GetResource( "http://home.netscape.com/NC-rdf#URL" );
  6. var  gYBrscTagValue   = gYBRdfService.GetResource( "http://www.mozilla.org/bookmark#tagvalue" );
  7. var  gYBrscTag        = gYBRdfService.GetResource( "http://www.mozilla.org/bookmark#tag" );
  8. var  gYBrscVisitCount = gYBRdfService.GetResource( "http://home.netscape.com/NC-rdf#VisitCount" );
  9. var  gYBrscLastVisitDate   = gYBRdfService.GetResource( "http://home.netscape.com/WEB-rdf#LastVisitDate" );
  10. var  gYBrscBundle   = gYBRdfService.GetResource( "http://www.mozilla.org/bundles#Bundle" );
  11. var  gYBrscBundleValue   = gYBRdfService.GetResource( "http://www.mozilla.org/bundles#BundleValue" );
  12.  
  13. // constants for cookie created by Delicious 2.0 XT
  14. const DEL_COOKIE_NAME = 'FFDeliciousXT';
  15. const DEL_COOKIE_URL = 'http://delicious.com/';
  16. const DEL_COOKIE_DOMAIN = '.delicious.com';
  17. const DEL_COOKIE_DATA = 'version=2.0';
  18. const DEL_COOKIE_EXPIERE_AFTER_DAYS = 0; // create session cookie
  19. const DEL_COOKIE_POST_REG = 'extReg';
  20. const DEL_COOKIE_EXT_IMPORT = 'FFDeliciousXT_Import';
  21.  
  22. var gYBrscBundleRoot = gYBRdfService.GetResource("NC:YBookmarksBundleRoot");
  23.  
  24. const Y_kSyncServiceContractID = "@mozilla.org/ybookmarks-sync-service;1";
  25. const Y_kDelContractID = "@yahoo.com/socialstore/delicious;1";
  26.  
  27. /* Regular expression used to get the toolbar folder from the bookmarks file. */
  28. const Y_TOOLBAR_FOLDER_RE = new RegExp(
  29.    "^.*<H3[^<>]*PERSONAL_TOOLBAR_FOLDER=\"true\"[^<>]*>([^<]*)</H3>.*$", "m");
  30. /* Wait to be performed between sync attempts. */
  31. const Y_SYNC_ATTEMPT_WAIT = 10 * 1000;
  32. const Y_BOOKMARKS_INITIAL_IMPORT_POLLING_PERIOD = 5 * 1000;
  33. const Y_BOOKMARKS_IMPORT_POLLING_PERIOD = 30 * 1000;
  34.  
  35. // Default threshold to hide the MyTags menu popup in the main menu
  36. const Y_DEFAULT_BOOKMARKS_THRESHOLD = 2000;
  37.  
  38. const YB_MENUITEM_NOICON = "menuitem yb_menuitem_noicon";
  39. var gPrefsWindow = null;
  40.  
  41. var ybookmarksMain = {
  42.    initialized: false,
  43.    gBookmarks: null,
  44.    syncservice: null,
  45.    strings: null,
  46.    prefs: null,
  47.    isNewTagAdded: false,
  48.    isBookmarkChanged: true,
  49.    isChangingDatasource : false,
  50.    _is_frequent_menu_update_required: true,
  51.    _is_recent_menu_update_required: true,
  52.    _is_recently_saved_menu_update_required: true,
  53.   
  54.    _bookmarkRdfObserver: null,
  55.    
  56.    
  57.   // _tagsToolbarMenuDatasource: null,
  58.    
  59.    /*
  60.    _popular_tag_menus: [ "ybookmarks_tags_menu_1", "ybookmarks_tags_menu_2", 
  61.                          "ybookmarks_tags_menu_3", "ybookmarks_tags_menu_4",
  62.                          "ybookmarks_tags_menu_5"
  63.                        ],
  64.    */                       
  65.   
  66.    onLoad: function() {
  67.       yDebug.print("Loading ybookmarks");
  68.  
  69.       // remove the listener first
  70.       window.removeEventListener( "load", yb_onLoad, false );
  71.  
  72.       /**
  73.        * Hack for managing inconsistancy of bookmarks menu id ->> 2.* "bookmarks-menu" 3.* "bookmarksMenu"
  74.        */
  75.       var bookmarksMenuId = "";
  76.       
  77.       if(ybookmarksUtils.getFFMajorVersion() > 2) {
  78.           bookmarksMenuId = "bookmarksMenu";    
  79.       }
  80.       else {
  81.           bookmarksMenuId = "bookmarks-menu";              
  82.       }
  83.  
  84.       this.gBookmarks = Components.classes["@mozilla.org/ybookmarks-store-service;1"].
  85.           getService(Components.interfaces.nsIYBookmarksStoreService);
  86.  
  87.       //register the sync service
  88.       this.syncservice =
  89.             Components.classes[Y_kSyncServiceContractID].
  90.                getService(Components.interfaces.nsIYBookmarkSyncService);
  91.  
  92.       
  93.       // hide only if user requests
  94.       this.prefs = Components.classes["@mozilla.org/preferences-service;1"]
  95.                       .getService(Components.interfaces.nsIPrefBranch);
  96.  
  97.       var hideFFBMMenu = false;
  98.       try {
  99.         hideFFBMMenu = this.prefs.getBoolPref("extensions.ybookmarks@yahoo.original.ui.hide");
  100.       } catch ( e ) { }
  101.       // we put this here because there's some lag with the ui hiding, 
  102.       // but we're safe to hide the bookmarks menu immediately
  103.       var bookmarksMenu = document.getElementById(bookmarksMenuId);      
  104.       if (bookmarksMenu) {
  105.         if(!ybookmarksUtils.isOSXLeopard()) {
  106.             bookmarksMenu.setAttribute('hidden', hideFFBMMenu);
  107.         }
  108.       }
  109.       
  110.       // initialization code
  111.       this.initialized = true;
  112.       this.strings = document.getElementById("ybookmarks-strings");
  113.  
  114.       /* register extension uninstall/disable observer. */
  115.       yUninstallObserver.register();
  116.  
  117.       ybContextMenu.register();
  118.       
  119.       ybUserInterface.register();
  120.     
  121.       /* Only do these if we have a visible toolbar */ 
  122.       if (window.toolbar.visible || window.menubar.visible || window.locationbar.visible) {
  123.       /*  var tagsMenu = document.getElementById( "ybookmarks_tags_1" );
  124.         tagsMenu.database.AddDataSource( this.gBookmarks.getDataSource() ); 
  125.         tagsMenu.builder.rebuild();
  126.         */
  127.         // add popupshowing event handler for feed-button.
  128.         // This is needed to prevent the addBookmarks dialog appearning for the RSS feeds.
  129.         // document.getElementById( "feed-button" ).addEventListener( "command", function(e) { yDebug.print( "In Feed Handler" ); e.preventBubble(); e.preventDefault(); return false; }, true );
  130.         try {
  131.         document.getElementById( "bookmark-sort-tree" ).database.
  132.                     AddDataSource( this.gBookmarks.getDataSource() );
  133.         document.getElementById( "bookmark-tags-tree" ).database.
  134.                     AddDataSource( this.gBookmarks.getDataSource() );
  135.         } catch (e) {
  136.           yDebug.print(e, YB_LOG_MESSAGE);
  137.         }
  138.         //this._bookmarkRdfObserver = new ybBookmarkMenuUpdater( tagsMenu );
  139.  
  140.         var del = Components.classes[Y_kDelContractID].getService( Components.interfaces.nsISocialStore );
  141.         var username = del.getUserName();
  142.         yDebug.print ( "User Name => " + username );
  143.         if (username == null || username.length == 0) {
  144.            yDebug.print ("No username found", YB_LOG_MESSAGE);
  145.         } else {
  146.            yDebug.print ("Username found", YB_LOG_MESSAGE);
  147.         }
  148.         yDebug.print ( "Login URL => " + del.login_url );
  149.         yDebug.print ( "Register URL => " + del.register_url );
  150.         yDebug.print ( "Service Name => " + del.service_name );
  151.  
  152.         var os = Components.classes["@mozilla.org/observer-service;1"]
  153.                                      .getService(Components.interfaces.nsIObserverService);
  154. /*        os.addObserver ( this._bookmarkRdfObserver, "ybookmark.syncBegin", false );
  155.         os.addObserver ( this._bookmarkRdfObserver, "ybookmark.syncDone", false );*/
  156.         os.addObserver( YbookmarkUpdateObserver, "ybookmark.syncBegin", false );
  157.         os.addObserver( YbookmarkUpdateObserver, "ybookmark.syncInfo", false );
  158.         os.addObserver( YbookmarkUpdateObserver, "ybookmark.syncDone", false );
  159.         os.addObserver( YbookmarkUpdateObserver, "ybookmark.forceRefresh", false );
  160.  
  161.         os.addObserver ( this._importBookmarksObserver, "ybookmark.importBookmarks", false);
  162.         os.addObserver ( this._disableExtensionObserver, "ybookmark.disableExtension", false);
  163.         os.addObserver ( this._addBookmarkObserver, "ybookmark.addBookmark", false);
  164.         os.addObserver ( yAddBookMark.bookmarkTransactionsObserver, "ybookmark.processTransactions", false);
  165.         os.addObserver ( this._errorObserver, "ybookmark.serverError", false);
  166.         os.addObserver( this._cookieObserver, "cookie-changed", false );
  167.         
  168.         yAddBookMark.addHooks();
  169.   
  170.         // 2007-01-24 cmyang: for some reason, we need to put this here. something with timing initializing the DOM key bindings.
  171.         // currently, when we remap the keys, we need to open the bookmarks and del menu
  172.         // which seems to reload the actual keybindings (opening a new window will work too).  Putting the call here probably makes
  173.         // the changes prior to the initial DOM initialization        
  174.         //var classic = false;
  175.         //:::Classic
  176.         
  177.         var menu = window.document.getElementById("ybookmarks_menu_popup");
  178.         var optionsMenu = window.document.getElementById("deliciousOptions");
  179.         if(ybookmarksUtils.getExtensionMode() == YB_EXTENSION_MODE_CLASSIC)  {        
  180.             ybUserInterface.tweakKeyBindings(false);            
  181.             //:::Classic:::                  
  182.             ybookmarksMain.showSpecialChildMenu(menu, "yb_classic_only");
  183.             //Tools->Options menu            
  184.             if(optionsMenu) {
  185.                 optionsMenu.hidden = true;
  186.             }
  187.         } else {
  188.             var remapKeyBindings = false;
  189.             try {
  190.               remapKeyBindings = this.prefs.getBoolPref("extensions.ybookmarks@yahoo.original.keybindings.remap");
  191.             } catch (e) {}
  192.             ybUserInterface.tweakKeyBindings(remapKeyBindings);            
  193.             //:::Classic:::Show all standard mode menu icons
  194.             ybookmarksMain.showSpecialChildMenu(menu, "yb_std_mode_only");
  195.             //Tools->Options menu            
  196.             if(optionsMenu) {
  197.                 optionsMenu.hidden = false;
  198.             }
  199.         }
  200.         os.addObserver( YBidManager, "ybookmark.userChanged", false);        
  201.         ybookmarksMain.setLoginState();
  202.       }
  203.       
  204.       //ybInfoPanel.register();
  205.  
  206.       // hack for making the vetical alignment of the nav-bar buttons the right size
  207.       // 1.5 icons+text, icons are 32x32.
  208.       // 2.0 icons+text, icons are 24x24.
  209.       var appInfo = Components.classes["@mozilla.org/xre/app-info;1"]
  210.                   .getService(Components.interfaces.nsIXULAppInfo);
  211.       var versionChecker = Components.classes["@mozilla.org/xpcom/version-comparator;1"]
  212.                                .getService(Components.interfaces.nsIVersionComparator);                  
  213.       if(versionChecker.compare(appInfo.version, "1.5") == 0) {
  214.         var btnDel = document.getElementById("del-button-delicious");
  215.         var btnTag = document.getElementById("del-button-tagPage");
  216.         if (btnDel) {
  217.           btnDel.setAttribute("class", btnDel.getAttribute("class") + " firefox15");
  218.             btnTag.setAttribute("class", btnTag.getAttribute("class") + " firefox15");
  219.           }
  220.       }      
  221.       
  222.       //check for the first time start
  223.       // allow the rest of fx to comeup before we attempt this
  224.       setTimeout(function() {
  225.                     try {
  226.                        ybookmarksMain._delayedLoad();
  227.                     } catch (e) {
  228.                        yDebug.print("Uncaught error during _delayedLoad:"
  229.                                     + e.message + (e.stack ? e.stack : ""),
  230.                                     YB_LOG_MESSAGE);
  231.                        throw e;
  232.                     }
  233.                  }, 250);
  234.  
  235.     this.checkUserLoggedInState();
  236.     //Show Delicious menu on Normal Mode.    
  237.     if(ybookmarksUtils.getExtensionMode() == YB_EXTENSION_MODE_STANDARD)  {
  238.         var ybMainDelMenu = document.getElementById("yb_menu");        
  239.         if(ybMainDelMenu) {
  240.             ybMainDelMenu.setAttribute('hidden', 'false');
  241.         }
  242.     }
  243.     
  244.       
  245.       if(ybookmarksUtils.getFFMajorVersion() > 2) {
  246.           try {
  247.           //Listen for webpage loads
  248.           gBrowser.addProgressListener(urlBarListenerFavIcon, Components.interfaces.nsIWebProgress.NOTIFY_ALL);
  249.           
  250.           /**
  251.            * This hack is added to ask for delicious post after adding new bookmark
  252.            */
  253.             PlacesCommandHook.bookmarkPage = function PCH_bookmarkPage(aBrowser, aParent, aShowEditUI) {
  254.                 
  255.                 var uri = aBrowser.currentURI;
  256.                 var itemId = PlacesUtils.getMostRecentBookmarkForURI(uri);
  257.                 if (itemId == -1) {
  258.                     // Copied over from addBookmarkForBrowser:
  259.                     // Bug 52536: We obtain the URL and title from the nsIWebNavigation
  260.                     // associated with a <browser/> rather than from a DOMWindow.
  261.                     // This is because when a full page plugin is loaded, there is
  262.                     // no DOMWindow (?) but information about the loaded document
  263.                     // may still be obtained from the webNavigation.
  264.                     var webNav = aBrowser.webNavigation;
  265.                     var url = webNav.currentURI;
  266.                     var title;
  267.                     var charset;      
  268.                     var description;
  269.                     try {
  270.                         title = webNav.document.title || url.spec;
  271.                         charset = webNav.document.characterSet;        
  272.                         description = PlacesUtils.getDescriptionFromDocument(webNav.document);
  273.                     }
  274.                     catch (e) { }
  275.                 
  276.                     if (aShowEditUI) {
  277.                         // If we bookmark the page here (i.e. page was not "starred" already)
  278.                         // but open right into the "edit" state, start batching here, so
  279.                         // "Cancel" in that state removes the bookmark.
  280.                         StarUI.beginBatch();
  281.                     }
  282.                     
  283.                     try {                
  284.                       var parent = aParent != undefined ?
  285.                                    aParent : PlacesUtils.unfiledBookmarksFolderId;
  286.                       var descAnno = { name: DESCRIPTION_ANNO, value: description };
  287.                       var txn = PlacesUIUtils.ptm.createItem(uri, parent, -1,
  288.                                                              title, null, [descAnno]);
  289.                       PlacesUIUtils.ptm.doTransaction(txn);
  290.                       // Set the character-set
  291.                       if (charset)
  292.                         PlacesUtils.history.setCharsetForURI(uri, charset);
  293.                       itemId = PlacesUtils.getMostRecentBookmarkForURI(uri);
  294.                     }
  295.                     catch(e) {
  296.                         yDebug.print("ybookmarksOverlay.js::Onload():: Exception - "+e, YB_LOG_MESSAGE);
  297.                     }
  298.                     /**
  299.                        * Ask if user wants to add this item to delicious
  300.                        */
  301.                     var prefs = Components.classes["@mozilla.org/preferences-service;1"].
  302.                       getService(Components.interfaces.nsIPrefBranch);
  303.                       
  304.                     var remindCheck = prefs.getBoolPref("extensions.ybookmarks@yahoo.original.add.suggest.delicious");
  305.                     if (remindCheck) {
  306.                       var strings = document.getElementById("ybookmarks-strings");
  307.                       var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].
  308.                                             getService(Components.interfaces.nsIPromptService);
  309.                 
  310.                       var cnfTitle = strings.getString("extensions.ybookmarks.original.add.dialog.hook.title");
  311.                       var cnfText = strings.getString("extensions.ybookmarks.original.add.dialog.hook.text");
  312.                       var cnfRemind = strings.getString("extensions.ybookmarks.original.add.dialog.hook.remind");    
  313.                       remindCheck = { value: true };
  314.                       var promptFlags = (promptService.BUTTON_TITLE_NO * promptService.BUTTON_POS_0) +
  315.                                         (promptService.BUTTON_TITLE_YES * promptService.BUTTON_POS_1) +
  316.                                         promptService.BUTTON_POS_1_DEFAULT;
  317.                                       
  318.                       var addToDel = promptService.confirmEx(this, cnfTitle, cnfText, promptFlags, "", "", "", cnfRemind, remindCheck);
  319.                 
  320.                       if (!remindCheck.value) {
  321.                         prefs.setBoolPref("extensions.ybookmarks@yahoo.original.add.suggest.delicious", false);
  322.                       }
  323.                       
  324.                       if (addToDel == 1) {
  325.                         //url, title, charset, isWebPanel, notes, feedUrl, blankEntry, postData, keywordInput 
  326.                           yAddBookMark.open(url.spec, title, charset, false, description);
  327.                       }
  328.                     }
  329.                 }
  330.                 
  331.                 // Revert the contents of the location bar
  332.                 handleURLBarRevert();
  333.  
  334.                 // dock the panel to the star icon when possible, otherwise dock
  335.                 // it to the content area
  336.                 if (aBrowser.contentWindow == window.content) {
  337.                   var starIcon = aBrowser.ownerDocument.getElementById("star-button");
  338.                   if (starIcon && isElementVisible(starIcon)) {
  339.                     if (aShowEditUI)
  340.                       StarUI.showEditBookmarkPopup(itemId, starIcon, "after_end");
  341.             //@line 419 "/e/fx19rel/WINNT_5.2_Depend/mozilla/browser/base/content/browser-places.js"
  342.                     return;
  343.                   }
  344.                 }
  345.                 StarUI.showEditBookmarkPopup(itemId, aBrowser, "overlap");
  346.               }
  347.           }
  348.           catch(e) {
  349.               yDebug.print("ybookmarksOverlay.js::Onload():: Exception - "+e, YB_LOG_MESSAGE);
  350.           }
  351.       }
  352.     
  353.       yDebug.print("Done loading ybookmarks", YB_LOG_MESSAGE);      
  354.    },
  355.    
  356.    showSpecialChildMenu: function(menu, attribute) {
  357.         for(i = 0; i < menu.childNodes.length; ++i ) {
  358.             val = ( menu.childNodes[ i ] ).getAttribute( attribute );
  359.             if( val && ( val == "true" ) ) {
  360.                 ( menu.childNodes[ i ] ).hidden = false;
  361.             }
  362.            }    
  363.    },
  364.    
  365.    onUnload: function() {
  366.      this.gBookmarks.flush(true); 
  367.      ybContextMenu.unregister();
  368.   /*   try {
  369.        ybookmarksMain.gBookmarks.getDataSource().RemoveObserver( ybookmarksMain._bookmarkRdfObserver );
  370.      } catch ( e ) { }
  371. */
  372.      try {
  373.        this.prefs.removeObserver( "", YBonMenuTypePrefChanged );
  374.      } catch ( e ) { }
  375.      var os = Components.classes["@mozilla.org/observer-service;1"]
  376.                                      .getService(Components.interfaces.nsIObserverService);
  377.      try {                                     
  378.   /*     os.removeObserver ( this._bookmarkRdfObserver, "ybookmark.syncBegin" );
  379.        os.removeObserver ( this._bookmarkRdfObserver, "ybookmark.syncDone" );*/
  380.        os.removeObserver ( YbookmarkUpdateObserver, "ybookmark.syncBegin" );
  381.        os.removeObserver ( YbookmarkUpdateObserver, "ybookmark.syncInfo" );
  382.        os.removeObserver ( YbookmarkUpdateObserver, "ybookmark.syncDone" );
  383.        os.removeObserver ( YbookmarkUpdateObserver, "ybookmark.forceRefresh");
  384.  
  385.        os.removeObserver ( this._importBookmarksObserver, "ybookmark.importBookmarks");
  386.        os.removeObserver ( this._disableExtensionObserver, "ybookmark.disableExtension");
  387.        os.removeObserver ( this._addBookmarkObserver, "ybookmark.addBookmark");
  388.        os.removeObserver ( yAddBookMark.bookmarkTransactionsObserver, "ybookmark.processTransactions");
  389.        os.removeObserver ( this._errorObserver, "ybookmark.serverError");
  390.        os.removeObserver ( YBidManager, "ybookmark.userChanged");
  391.        os.removeObserver( this._cookieObserver, "cookie-changed");
  392.       if(ybookmarksUtils.getFFMajorVersion() > 2) {
  393.        //Clear listen for webpage loads
  394.        gBrowser.removeProgressListener(urlBarListenerFavIcon);
  395.       }
  396.      }
  397.      catch (e) { }
  398.  
  399.      try {
  400.        //ybInfoPanel.unregister();
  401.      } catch (e) { }
  402.      
  403.      try {
  404.        yUninstallObserver.unregister();
  405.      } catch ( e ) {
  406.      }
  407.      
  408.      ybUserInterface.unregister();
  409.      
  410.    },
  411.    
  412.    postRegCookiePresent : function() {
  413.            var cookieManager = ( Components.classes[ "@mozilla.org/cookiemanager;1" ]
  414.                                            .getService( Components.interfaces.nsICookieManager ) );
  415.          var iter = cookieManager.enumerator; 
  416.          while( iter.hasMoreElements() ) { 
  417.             var cookie = iter.getNext(); 
  418.             if( cookie instanceof Components.interfaces.nsICookie ) {
  419.                    if(cookie.host == DEL_COOKIE_DOMAIN && cookie.name == DEL_COOKIE_POST_REG) {
  420.                   yDebug.print( "ybookmarksOverlay.js:: postReg cookie found", YB_LOG_MESSAGE );
  421.                   return true;
  422.                    } 
  423.             } 
  424.          }
  425.          return false;       
  426.    },
  427.    
  428.    addToolbarButtons : function() {
  429.         var toolbox = document.getElementById("navigator-toolbox");
  430.         var toolboxDocument = toolbox.ownerDocument;
  431.  
  432.         var hasDeliciousButton = false, hasTagPageButton = false, hasDeliciousPageButton = false;
  433.         
  434.         for (var i = 0; i < toolbox.childNodes.length; ++i) {
  435.             var toolbar = toolbox.childNodes[i];
  436.  
  437.             if (toolbar.localName == "toolbar"
  438.                 && toolbar.getAttribute("customizable")=="true") {
  439.  
  440.                if(toolbar.currentSet.indexOf("del-button-delicious") > -1)
  441.                   hasDeliciousButton = true;
  442.                if(toolbar.currentSet.indexOf("del-button-tagPage")>-1)
  443.                   hasTagPageButton = true;
  444.                if(toolbar.currentSet.indexOf("del-button-delicious-page") > -1)
  445.                      hasDeliciousPageButton = true;
  446.             }
  447.         }    
  448.         
  449.         if(!hasDeliciousButton || !hasTagPageButton || !hasDeliciousPageButton) {
  450.             var toolbar = document.getElementById("nav-bar");
  451.  
  452.             var newSet = "";
  453.             var child = toolbar.firstChild;
  454.             while(child){
  455.                 //Order of buttons is important
  456.                 if(!hasDeliciousPageButton && child.id == "urlbar-container") {
  457.                     newSet += "del-button-delicious-page,";
  458.                     hasDeliciousPageButton = true;
  459.                 }
  460.                 
  461.                 if(!hasDeliciousButton
  462.                         && (child.id=="del-button-tagPage"
  463.                         || child.id=="urlbar-container")) {
  464.                     newSet += "del-button-delicious,";
  465.                     //yDebug.print("ybookmarksOverlay.js::ybookmarksMain::addToolbarButtons()=> Adding delicious button", YB_LOG_MESSAGE);
  466.                     hasDeliciousButton = true;
  467.                 }
  468.  
  469.                 if(!hasTagPageButton && child.id=="urlbar-container") {
  470.                     newSet += "del-button-tagPage,";
  471.                     hasTagPageButton = true;
  472.                 }                  
  473.  
  474.                 newSet += child.id+",";
  475.                 child = child.nextSibling;
  476.             }
  477.  
  478.             newSet = newSet.substring(0, newSet.length-1);
  479.             toolbar.currentSet = newSet;
  480.             toolbar.setAttribute("currentset", newSet);
  481.             toolboxDocument.persist(toolbar.id, "currentset");
  482.             try {
  483.                 BrowserToolboxCustomizeDone(true);                    
  484.             } catch (e) {
  485.                 /* protect against future change */
  486.             }
  487.         }           
  488.    },
  489.    
  490.    upgradeFrom1_5 : function() {
  491.         var toolbar = document.getElementById("nav-bar");
  492.         var newSet = "";
  493.         //yDebug.print("Current set:" + toolbar.currentSet, YB_LOG_MESSAGE);
  494.         var currButtons = toolbar.currentSet.split(",");
  495.         for( x in currButtons) {
  496.             var cur = currButtons[x];
  497.             if((cur != "del-button-tagPage") && (cur != "del-button-delicious")) {
  498.                 if(cur == "urlbar-container") {
  499.                     newSet += "del-button-delicious-page,del-button-delicious,del-button-tagPage," + currButtons[x] + ",";
  500.                 } else {
  501.                     newSet += currButtons[x] + ",";
  502.                 }
  503.             }
  504.         }
  505.         newSet = newSet.substring(0, newSet.length-1);
  506.         toolbar.currentSet = newSet;
  507.         toolbar.setAttribute("currentset", newSet);
  508.         toolboxDocument.persist(toolbar.id, "currentset");
  509.         try {
  510.             BrowserToolboxCustomizeDone(true);                    
  511.         } catch (e) {
  512.             /* protect against future change */
  513.         }
  514.    },
  515.  
  516.    firstTimeStart : function() {
  517.        yDebug.print("ybookmarksOverlay.js::ybookmarksMain::firstTimeStart()=> Invoked", YB_LOG_MESSAGE);
  518.      try {
  519.       var currentVersionNum = this.strings.getString("extensions.ybookmarks.versionNum");
  520.       yDebug.print("ybookmarksOverlay.js::ybookmarksMain::firstTimeStart()=> Version being installed = "
  521.           +currentVersionNum, YB_LOG_MESSAGE);
  522.       var newInstall        = false;
  523.       var upgraded          = false;
  524.       var upgradedFrom1_3   = false;
  525.       var upgradedFromOlderthan2_0_58 = false;
  526.       try{
  527.           //This will throw an exception for fresh install and in turn set the version number in prefs.
  528.          var num = this.prefs.getCharPref("extensions.ybookmarks@yahoo.version.number");
  529.                       
  530.          if(num != currentVersionNum){
  531.             this.prefs.setCharPref("extensions.ybookmarks@yahoo.version.number",
  532.                                    currentVersionNum);
  533.             yDebug.print("ybookmarksOverlay.js::ybookmarksMain::firstTimeStart()=> Install Type = Upgrade",
  534.                 YB_LOG_MESSAGE);
  535.             upgraded = true;
  536.          }  
  537.          var versionChecker = Components.classes["@mozilla.org/xpcom/version-comparator;1"]
  538.             .getService(Components.interfaces.nsIVersionComparator);
  539.          //The first version of the extn with two store impl   
  540.          if (versionChecker.compare(num, "1.4.00") < 0) {
  541.             upgradedFrom1_3 = true;  
  542.          }
  543.          if (versionChecker.compare(num, "2.0.58") < 0) {
  544.             upgradedFromOlderthan2_0_58 = true;  
  545.          }
  546.          
  547.       } catch(e){
  548.          this.prefs.setCharPref("extensions.ybookmarks@yahoo.version.number",
  549.                                 currentVersionNum);
  550.          ybToolbar.firstTimeStart();
  551.          newInstall = true;
  552.          yDebug.print("ybookmarksOverlay.js::ybookmarksMain::firstTimeStart()=> Install Type = New Install",
  553.              YB_LOG_MESSAGE);
  554.       }
  555.  
  556.       if(newInstall || upgraded) {      
  557.         
  558.         if (newInstall) {
  559.             //Force open sidebar on new install only.
  560.             setTimeout(function() { toggleSidebar('viewYBookmarksSidebar', true); }, 100);
  561.         }    
  562.             
  563.         //Add the toolbar buttons forcefully on upgrade from version < 2.0.58.
  564.         if(newInstall) {
  565.             this.addToolbarButtons();       
  566.         } else if(upgradedFromOlderthan2_0_58) {
  567.             //Forcefully add buttons in correct order.
  568.             this.upgradeFrom1_5();
  569.         }
  570.                 
  571.         //Open tour url
  572.         var postRegCookie = this.postRegCookiePresent();
  573.         if(upgraded || (newInstall && !postRegCookie)) {
  574.         setTimeout(function(aUrl) {
  575.                        var browser = document.getElementById("content");
  576.                        var tab = browser.addTab(aUrl);  
  577.                        browser.selectedTab = tab;
  578.                       }, 
  579.                       100, 
  580.                       deliciousService.getQuickTourUrl()
  581.                    );
  582.         }
  583.       }
  584.       
  585.       if (upgradedFrom1_3) {
  586.         // popup an informative alert for those upgrading
  587.         try {          
  588.           setTimeout(function() { ybookmarksMain.doUpgradeFor1_3(); }, 250);
  589.         } catch (e) {
  590.           yDebug.print("error with upgrade 1.3 popup: " + e, YB_LOG_MESSAGE);
  591.         }
  592.         
  593.       }
  594.       
  595.   } catch (e) {
  596.     yDebug.print("firstTimeStart(): " + e, YB_LOG_MESSAGE);
  597.   }
  598.   },   
  599.   
  600.   doUpgradeFor1_3: function() {
  601.     try {
  602.         var showBookmarkMenu = {};
  603.         
  604.         /**
  605.          * Show UI hide dialog only for FF below 3.x and set original.ui.hide to false for greater versions
  606.          */
  607.         if(ybookmarksUtils.getFFMajorVersion() < 3) {
  608.             openDialog("chrome://ybookmarks/content/upgradeAlertFrom1_3.xul", "upgradeAlert", "chrome,modal=yes,centerscreen", showBookmarkMenu); 
  609.         }
  610.         else {
  611.             showBookmarkMenu.value = true;
  612.         }
  613.  
  614.         try { 
  615.           this.prefs.setBoolPref("extensions.ybookmarks@yahoo.original.ui.hide", showBookmarkMenu.value == false);
  616.         } catch (e) {
  617.           yDebug.print("upgrading 1.3: error with setting ui preference: " + e, YB_LOG_MESSAGE);
  618.         }
  619.         
  620.         //copy over the favorite tags from extra.rdf
  621.         try {
  622.         this._copyFavoriteTagsToTwoStore();
  623.       } catch (e) {
  624.         yDebug.print("upgrading 1.3: error with copying over favorite tags: " + e, YB_LOG_MESSAGE);
  625.       }
  626.       //last run version is older than the two-store version. restore bookmarks
  627.       yDebug.print("Attempting to restore old bookmarks", YB_LOG_MESSAGE);
  628.       try {
  629.         var ds = Components.classes["@mozilla.org/file/directory_service;1"]
  630.             .createInstance(Components.interfaces.nsIProperties);
  631.         var yBackup = ds.get("ProfD", Components.interfaces.nsIFile);
  632.         yBackup.append("bk_bookmarks.html");
  633.         if (yBackup.exists()) {
  634.             var currentTime = (new Date()).getTime();
  635.  
  636.             var yOrigBookmarks = ds.get("ProfD",
  637.                                         Components.interfaces.nsIFile);
  638.             yOrigBookmarks.append("bookmarks.html");
  639.             if (yOrigBookmarks.exists()) {
  640.                yOrigBookmarks.copyTo(null,
  641.                                      "upg_bookmarks_" + currentTime + ".html");
  642.             }
  643.  
  644.             
  645.             //based on FF version call relevant function
  646.             if(ybookmarksUtils.getFFMajorVersion() > 2) {
  647.                 yb_restoreBookmarksToPlaces(yBackup);
  648.             }
  649.             else {
  650.                 yb_restoreBookmarks(yBackup);
  651.             }
  652.  
  653.  
  654.             yBackup.moveTo(null, "bk_bookmarks_" + currentTime + ".html");
  655.  
  656.             yDebug.print("Restored old bookmarks", YB_LOG_MESSAGE);
  657.         }
  658.       } catch (e) {
  659.         yDebug.print("upgrading 1.3: error with restoring old bookmarks: " + e, YB_LOG_MESSAGE);
  660.       }
  661.       
  662.       //remove any persisted column orderings in the bookmark manager
  663.       // this is to ensure our default import column order
  664.       try {
  665.           var localstore  = Components.classes["@mozilla.org/rdf/datasource;1?name=local-store"].
  666.                               getService(Components.interfaces.nsIRDFDataSource);
  667.         var manRsrc     = gYBRdfService.GetResource("chrome://browser/content/bookmarks/bookmarksManager.xul#bookmarks-view");
  668.         var colinfoRsrc = gYBRdfService.GetResource("colinfo");
  669.         
  670.         var colinfo = localstore.GetTarget(manRsrc, colinfoRsrc, true);
  671.         if (colinfo) {
  672.           localstore.Unassert(manRsrc, colinfoRsrc, colinfo);
  673.         }
  674.       } catch (e) {
  675.         yDebug.print("error removing colinfo property from the bookmark manager: " + e, YB_LOG_MESSAGE);
  676.       }
  677.       
  678.       toggleSidebar('viewYBookmarksSidebar', true)
  679.       
  680.     } catch (e) {
  681.       yDebug.print("ybookmarksMain.showUpgradeAlert1_3(): " + e, YB_LOG_MESSAGE);
  682.     }
  683.     
  684.   }, 
  685.  
  686.    _delayedLoad: function() {
  687.       yDebug.print("Delayed load start ybookmarks");
  688.       
  689.       var pt = document.getElementById("PersonalToolbar"); // the old Bookmark Toolbar.  This is a check to see if we;re in the main overlay, and not some peon dialog
  690.       if (pt) {
  691.           var hideFFBMMenu = false;
  692.           var remapKeyBindings = false;
  693.           try {
  694.             hideFFBMMenu = this.prefs.getBoolPref("extensions.ybookmarks@yahoo.original.ui.hide");
  695.           } catch ( e ) { }         
  696.           ybUserInterface.tweakBookmarksUI(hideFFBMMenu);          
  697.       }
  698.       
  699.       var wm =
  700.          Components.classes["@mozilla.org/appshell/window-mediator;1"].
  701.             getService(Components.interfaces.nsIWindowMediator);
  702.       var winEnumerator = wm.getEnumerator("navigator:browser");
  703.       /* this guarantees that having multiple windows won't cause problems. */
  704.       var isFirstWindow = (winEnumerator.getNext() == window);
  705.       if (isFirstWindow) {
  706.          var incompatibleExts = yDisableExtensions.getIncompatibleExtensions();
  707.  
  708.          if (incompatibleExts.foundList.length > 0) {
  709.             window.openDialog(
  710.                "chrome://ybookmarks/content/yDisableExtensions.xul",
  711.                "disable-extensions-dialog", "chrome,dialog,modal,centerscreen",
  712.                incompatibleExts.foundList);
  713.             return;
  714.          } 
  715.          // warn user to enable cookies.
  716.          confirmEnableCookies();
  717.          if (!this.isEngineInstalled()) {
  718.             if (!this.installEngine()) {
  719.                 return;
  720.             }
  721.          }
  722.       }
  723.       
  724.       // Create delicious XT session cookie
  725.       /*
  726.         ybookmarksUtils.setCookie(DEL_COOKIE_NAME, DEL_COOKIE_URL, DEL_COOKIE_DOMAIN,
  727.              DEL_COOKIE_DATA, DEL_COOKIE_EXPIERE_AFTER_DAYS);         */
  728.       
  729.       // add the observer to change the status bar message during the update
  730.       /* Only do these if we have visible toolbar */ 
  731.       if (window.toolbar.visible || window.menubar.visible || window.locationbar.visible) {
  732.         // Add observer for the preference
  733.         this.prefs.addObserver( "", YBonMenuTypePrefChanged, false );
  734.   /*      var tagsMenu = document.getElementById( "ybookmarks_tags_1" );
  735.  
  736.         // Add observer to the datasource
  737.         ybookmarksMain.gBookmarks.getDataSource().AddObserver( this._bookmarkRdfObserver );
  738. */
  739.       }
  740.       
  741.       //Show sidebar on a mode change to classic
  742.       try {
  743.          var loadSidebar = this.prefs.getBoolPref("extensions.ybookmarks@yahoo.engine.revert.standard.mode");
  744.          if(loadSidebar) {
  745.              toggleSidebar('viewYBookmarksSidebar', true);
  746.              this.prefs.setBoolPref("extensions.ybookmarks@yahoo.engine.revert.standard.mode", false);
  747.          }      
  748.       } catch(e) {}
  749.  
  750.       setTimeout(function() {
  751.                     try {
  752.                        ybookmarksMain._delayedLoad2();
  753.                     } catch (e) {
  754.                        yDebug.print("Uncaught error during _delayedLoad2:"
  755.                                     + e.message,
  756.                                     YB_LOG_MESSAGE);
  757.                        throw e;
  758.                     }
  759.                  }, 1500);
  760.     },
  761.       
  762.     /* begin the sync.  we delay this so that the localstore can be written out first */
  763.     _delayedLoad2: function() {
  764.       if (this.isEngineInstalled()) {
  765.  
  766.          //only run the syn on the first browser window and active the syn in
  767.          // the hidden window
  768.          var wm =
  769.             Components.classes["@mozilla.org/appshell/window-mediator;1"].
  770.                getService(Components.interfaces.nsIWindowMediator);
  771.          var enumerator = wm.getEnumerator("navigator:browser");
  772.          var counter = 0;
  773.          
  774.          while (enumerator.hasMoreElements()) {
  775.             enumerator.getNext();
  776.             counter++;
  777.          }
  778.       
  779.          var del = Components.classes[Y_kDelContractID].getService( Components.interfaces.nsISocialStore );
  780.          var username  = del.getUserName();
  781.          if (username) {
  782.       
  783.            if (counter < 2) {
  784.              this.syncservice.sync(true);
  785.            }
  786.            //Removing import status check on restart.
  787.            //this._checkBookmarkImportPolling();
  788.          }
  789.          
  790.         /*
  791.         // If there is no update from delicious, callback in not done. Bookmark menu is not populated.
  792.         // Will have to get some return value from sync call. For the time being, call the syncDone again.
  793.         //bookmarkSyncCallback.syncDone();
  794.  
  795.         var bookmarkSyncCallback = {
  796.  
  797.           syncDone: function() {
  798.  
  799.             if ( ybookmarksMain._is_recent_menu_update_required ) {
  800.               ybookmarks_Main.addBookmarksToPopup( 
  801.                                 document.getElementById( "ybookmarks_rc_visited_pop" ),
  802.                                 "bookmark-sort-tree-visitdate-col" );
  803.               ybookmarksMain._is_recent_menu_update_required = false;
  804.             }
  805.             if ( ybookmarksMain._is_frequent_menu_update_required ) {
  806.               ybookmarks_Main.addBookmarksToPopup( 
  807.                                 document.getElementById( "ybookmarks_fr_visited_pop" ),
  808.                                 "bookmark-sort-tree-visitcount-col" );
  809.               ybookmarksMain._is_frequent_menu_update_required = false;
  810.             }
  811.  
  812.             ybookmarks_Main.addBookmarkItemsToMainMenu();
  813.           }
  814.         };
  815.         */      
  816.  
  817.         /*
  818.         for ( var index in this._popular_tag_menus ) {
  819.           document.getElementById( this._popular_tag_menus[index]).database.
  820.                           AddDataSource ( this.gBookmarks.getDataSource() );
  821.         }
  822.         */
  823.  
  824.         /*
  825.         for ( var index in this._bag_menus ) {
  826.           document.getElementById( this._bag_menus[index]).database.
  827.                           AddDataSource ( this.gBookmarks.getDataSource() );
  828.         }
  829.         */
  830.  
  831.         /*
  832.         document.getElementById( "ybookmarks-feed-menu" ).database.
  833.                           AddDataSource ( this.gBookmarks.getDataSource() );
  834.         */
  835.  
  836.         //this._buildTagsToolbarMenu();
  837.               
  838.       }
  839.       
  840.       this.checkUserLoggedInState();
  841.       yDebug.print("Delayed load done ybookmarks", YB_LOG_MESSAGE);
  842.  
  843.    },
  844.     
  845.    /*
  846.     * Copy the old Favorite Tags from extra.rdf
  847.     * We keep the resources hardcoded because this is a backwards compatability function, 
  848.     * and all the "history" should remain local to the function
  849.     */
  850.    _copyFavoriteTagsToTwoStore: function() {
  851.     try {
  852.       yDebug.print("COPYING FAVORITE TAGS TO TWOSTORE");
  853.         var extraFile = ybookmarksUtils.getProfileDir();  
  854.         extraFile.append("extra.rdf");
  855.         if (!extraFile.exists()) {
  856.           return;
  857.         }
  858.         var networkProtocol = Components.classes["@mozilla.org/network/protocol;1?name=file"].
  859.            createInstance(Components.interfaces.nsIFileProtocolHandler);
  860.       var extraURI = networkProtocol.newFileURI(extraFile).spec;
  861.       var extra = Components.classes["@mozilla.org/rdf/datasource;1?name=xml-datasource"].
  862.                     createInstance(Components.interfaces.nsIRDFRemoteDataSource);
  863.         extra.QueryInterface(Components.interfaces.nsIRDFDataSource);
  864.         try {
  865.            extra.Init(extraURI);
  866.          } catch (e) {
  867.              yDebug.print("Error in initializing extra.rdf: " + e);
  868.          }
  869.  
  870.          try {
  871.            extra.Refresh(true);
  872.          } catch (e) {
  873.              yDebug.print("Error in refreshing extra.rdf: " + e);
  874.          }
  875.          
  876.          var conUtils = Components.classes["@mozilla.org/rdf/container-utils;1"].
  877.                             getService(Components.interfaces.nsIRDFContainerUtils);
  878.          var favTagRoot = conUtils.MakeSeq(extra, gYBRdfService.GetResource("NC:YBookmarksFavoriteTagsRoot"));
  879.          var favTagEnum = favTagRoot.GetElements();
  880.          var favTagValueRsrc = gYBRdfService.GetResource("http://www.mozilla.org/bookmark#favoriteTagValue");
  881.          var favTagOrderRsrc = gYBRdfService.GetResource("http://www.mozilla.org/bookmark#favoriteTagOrder");
  882.       
  883.          while (favTagEnum.hasMoreElements()) {
  884.            var favTagRsrc = favTagEnum.getNext().QueryInterface(Components.interfaces.nsIRDFResource);
  885.            var nameRsrc = null;
  886.            var orderRsrc = null;
  887.     
  888.            nameRsrc = extra.GetTarget(favTagRsrc, favTagValueRsrc, true);
  889.            if (!nameRsrc) {
  890.              yDebug.print("Favorite Tag resource " + favTagValueRsrc + " missing favtag value");
  891.              continue;
  892.            }
  893.            nameRsrc.QueryInterface(Components.interfaces.nsIRDFLiteral);
  894.            var name = nameRsrc.Value;
  895.          var order = null;
  896.         
  897.            orderRsrc = extra.GetTarget(favTagRsrc, favTagOrderRsrc, true);
  898.            if (orderRsrc) {
  899.              orderRsrc.QueryInterface(Components.interfaces.nsIRDFLiteral);
  900.              order = orderRsrc.Value;
  901.            } else {
  902.              yDebug.print("Favorite Tag resource " + favTagValueRsrc + "(" + name + ") missing order value. using default");
  903.            order = FAVTAGS_ORDER_DEFAULT;
  904.            }
  905.          this.gBookmarks.addFavoriteTag(name);
  906.          this.gBookmarks.setFavoriteTagOrder(name, order);
  907.          }
  908.        ybToolbar.refreshCurrentView();
  909.     } catch (e) {
  910.       yDebug.print("_copyFavoriteTagsToTwoStore(): " + e, YB_LOG_MESSAGE);
  911.     }     
  912.    },
  913.    
  914.    isBookmarkImportPolling: function() {
  915.      if (!this.prefs.prefHasUserValue("extensions.ybookmarks@yahoo.import.polling")) {
  916.        this.prefs.setBoolPref("extensions.ybookmarks@yahoo.import.polling", false);
  917.      }
  918.     return this.prefs.getBoolPref("extensions.ybookmarks@yahoo.import.polling");
  919.      
  920.    },
  921.    
  922.    setBookmarkImportPolling: function(polling) {
  923.      this.prefs.setBoolPref("extensions.ybookmarks@yahoo.import.polling", polling);
  924.     },
  925.     
  926.     _startImportAfterPolling: function(cookie) {
  927.         var callback = {
  928.         _ybookmarksMain: null,
  929.         _cookie: null,
  930.         
  931.         onload: function(result) {
  932.            yDebug.print("ybookmarksOverlay.js::_startImportAfterPolling=> Import status check onload", YB_LOG_MESSAGE);    
  933.            var propertyBag = result.queryElementAt(0, Components.interfaces.nsIPropertyBag);
  934.            var status = propertyBag.getProperty("status"); 
  935.            var strings = document.getElementById("ybookmarks-strings"); 
  936.            yDebug.print("ybookmarksOverlay.js::_startImportAfterPolling=> Import status is :" + status, YB_LOG_MESSAGE);
  937.            //"complete", "importing" or "failed"
  938.            if (status == "importing") {                   
  939.                   //Show MessageBox. 
  940.                   var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].
  941.                        getService(Components.interfaces.nsIPromptService);
  942.                 var title = strings.getString("extensions.ybookmarks.product.name");
  943.                 var text = strings.getString("extensions.ybookmarks.import.already.running");
  944.                 promptService.alert(this, title, text);
  945.            } else {
  946.                this._ybookmarksMain._importBookmarks(this._cookie);               
  947.            }
  948.         },
  949.         onerror: function(result) {
  950.             yDebug.print("ybookmarksOverlay.js::_startImportAfterPolling=> Import status check failed", YB_LOG_MESSAGE);
  951.         }      
  952.       };
  953.  
  954.       var ssr = Components.classes["@yahoo.com/socialstore/delicious;1"].
  955.               getService(Components.interfaces.nsISocialStore);         
  956.       callback._ybookmarksMain = this;
  957.       callback._cookie = cookie;
  958.       ssr.getImportStatus(callback);     
  959.         
  960.     },
  961.     
  962.    _checkBookmarkImportPolling: function() {
  963.      var callback = {
  964.         _ybookmarksMain: null,
  965.  
  966.         onload: function(result) {
  967.            var propertyBag = result.queryElementAt(0, Components.interfaces.nsIPropertyBag);
  968.            var status = propertyBag.getProperty("status");  
  969.            //"complete", "importing" or "failed"
  970.            if (status == "importing") {
  971.                 this._ybookmarksMain.setBookmarkImportPolling(true);
  972.                  setTimeout(function() {    
  973.                              var ssr = Components.classes["@yahoo.com/socialstore/delicious;1"].
  974.                                getService(Components.interfaces.nsISocialStore);
  975.                              ssr.getImportStatus(ybookmarksUtils.importStatusCallback); }, 
  976.                            Y_BOOKMARKS_INITIAL_IMPORT_POLLING_PERIOD);
  977.                }
  978.  
  979.         },
  980.         onerror: function(event) {
  981.         }      
  982.       };
  983.  
  984.       var ssr = Components.classes["@yahoo.com/socialstore/delicious;1"].
  985.               getService(Components.interfaces.nsISocialStore);         
  986.       callback._ybookmarksMain = this;
  987.       ssr.getImportStatus(callback);
  988.    },
  989.    
  990.    onBookmarksMenuPopupShowing: function(event) {
  991.  
  992.          if(ybookmarksUtils.getExtensionMode() == YB_EXTENSION_MODE_CLASSIC)  {
  993.              //:::Classic, we dont need this menu option.
  994.              return true; 
  995.          }
  996.          
  997.       var popup = event.target;
  998.       var hideThisMenu = document.getElementById("yb_bookmarks_menu_hide_this_menu");
  999.       var sep;
  1000.     
  1001.       if (hideThisMenu && hideThisMenu.parentNode == popup) {
  1002.          sep = document.getElementById("yb_bookmarks_menu_hide_this_menu_sep");
  1003.          popup.removeChild(sep);
  1004.          popup.removeChild(hideThisMenu);
  1005.        }
  1006.  
  1007.        hideThisMenu = document.createElement("menuitem");
  1008.        hideThisMenu.setAttribute("observes", "yb-broadcaster-bookmarksmenu-hide-this");
  1009.        hideThisMenu.setAttribute("id", "yb_bookmarks_menu_hide_this_menu");
  1010.        sep = document.createElement("menuseparator");
  1011.        sep.setAttribute("id", "yb_bookmarks_menu_hide_this_menu_sep");
  1012.     
  1013.        popup.appendChild(sep);
  1014.        popup.appendChild(hideThisMenu);
  1015.     
  1016.    },
  1017.     
  1018.    bookmarkThisTab: function() {
  1019.     var tab = getBrowser().mContextTab;
  1020.     if (tab.localName != "tab")
  1021.         tab = getBrowser().mCurrentTab;
  1022.     yAddBookMark.addBookmarkForTabBrowser(tab.linkedBrowser);
  1023.    },
  1024.    
  1025.    /* necc because we don't have a way of getting a resource for multiple tags yet */
  1026. /*   _refreshTagsToolbarMenuDatasource: function() {
  1027.      try {
  1028.       var container = Components.classes["@mozilla.org/rdf/container;1"].
  1029.                        createInstance(Components.interfaces.nsIRDFContainer);
  1030.       container.Init(this._tagsToolbarMenuDatasource, grsrcTagsToolbarMenu);
  1031.        
  1032.       // empty elements
  1033.       var containerEnum = container.GetElements();
  1034.       while (containerEnum.hasMoreElements()) {
  1035.         var e = containerEnum.getNext();
  1036.         container.RemoveElement(e, true);
  1037.       }
  1038.       
  1039.       //add tags
  1040.       var tags = ybBags.getTagsToolbarBag().tags;
  1041.       for(var i=0; i<tags.length; i++) {
  1042.         var rsrcName = this.gBookmarks.getTagResourceName(tags[i]);
  1043.         if (rsrcName) {
  1044.           var rsrc = gYBRdfService.GetResource(rsrcName);
  1045.           rsrc.QueryInterface(Components.interfaces.nsIRDFNode);
  1046.           container.AppendElement(rsrc);
  1047.         }
  1048.       }
  1049.       
  1050.       var menu = document.getElementById("ybookmarks_tags_toolbar");
  1051.       menu.builder.rebuild();
  1052.       
  1053.     } catch (e) { 
  1054.       alert(e);
  1055.     }  
  1056.    },
  1057.   */ 
  1058.    _exciseMenuDestructive: function(parent, start, end) {
  1059.      var start_i = -1;
  1060.      for(var i=0; i < parent.childNodes.length; i++) {
  1061.          if (parent.childNodes[i] == start) { 
  1062.            start_i = i;
  1063.            break; 
  1064.          } 
  1065.      }
  1066.      if (start_i >= 0) {
  1067.        var child = parent.childNodes[start_i+1]; // for some reason, a for loop doesn't work... early binding?
  1068.        while (child != end) { 
  1069.           parent.removeChild (child);
  1070.           child = parent.childNodes[start_i+1];
  1071.        }
  1072.  
  1073.      }
  1074.  
  1075.    },
  1076.    
  1077.    addTagsToolbarToMenu: function(event) {
  1078.      
  1079.      try {     
  1080.         //Hide switchButton on pending mode switch.      
  1081.        if(ybookmarksUtils.getExtensionMode() == YB_EXTENSION_MODE_CLASSIC)  {
  1082.           var pref = Components.classes["@mozilla.org/preferences-service;1"].
  1083.                  getService(Components.interfaces.nsIPrefBranch);        
  1084.           var modeChange = pref.getCharPref("extensions.ybookmarks@yahoo.engine.set.mode");          
  1085.           if(modeChange == YB_EXTENSION_MODE_STANDARD) {                            
  1086.               var switchButton = document.getElementById("ybookmarks_switch_to_std_mode");
  1087.               switchButton.hidden = true;
  1088.           }                  
  1089.        }     
  1090.        if (event.target.id != "ybookmarks_menu_popup" || ybookmarksUtils.getExtensionMode() == YB_EXTENSION_MODE_CLASSIC) {
  1091.           return; 
  1092.        }
  1093.        var myTagsMenu = document.getElementById( "ybookmarks_tags_menu" );
  1094.        if ( myTagsMenu ) {
  1095.         /* var threshold = Y_DEFAULT_BOOKMARKS_THRESHOLD;
  1096.          try {
  1097.            threshold = this.prefs.getIntPref( "extensions.ybookmarks@yahoo.bookmark.threshold" );
  1098.          } catch ( e ) {
  1099.          }
  1100.          
  1101.          if ( this._cachedTotalBookmarks > threshold || (this._cachedTotalBookmarks = this.gBookmarks.getTotalBookmarks()) > threshold ) {
  1102.            myTagsMenu.hidden = true;
  1103.          } else {
  1104.            myTagsMenu.hidden = false;
  1105.          }*/
  1106.          
  1107.          try {
  1108.            myTagsMenu.hidden = this.prefs.getBoolPref("extensions.ybookmarks@yahoo.deliciousmenu.hidetagsmenu");
  1109.          } catch (e) {
  1110.            yDebug.print("error with gettting preference: extensions.ybookmarks@yahoo.deliciousmenu.showtagsmenu: " + e);
  1111.          }
  1112.        }
  1113.               
  1114.        /*var container = Components.classes["@mozilla.org/rdf/container;1"].
  1115.                        createInstance(Components.interfaces.nsIRDFContainer);
  1116.        container.Init(this._tagsToolbarMenuDatasource, grsrcTagsToolbarMenu);
  1117.        */
  1118.        var popup = event.target;
  1119.        var start = document.getElementById("ybookmarks_tags_toolbar_start");
  1120.        var stop = document.getElementById("ybookmarks_tags_toolbar_stop");
  1121.        this._exciseMenuDestructive(popup, start, stop);
  1122.       
  1123.        var tags = ybBags.getFavoriteTags();
  1124.        
  1125.        for (var i=0; i < tags.length; i++) {
  1126.         var tagArg =  {name: tags[i],
  1127.                        url: "",
  1128.                        icon: "",
  1129.                        type: YB_TYPE_TAG,
  1130.                        order: ybBags.getFavoriteTagOrder(tags[i]),
  1131.                        menubar: true,
  1132.                        favoriteTag: true};
  1133.         var menuItem = ybBookmarksMenu.createMenuItem(tagArg);
  1134.         popup.insertBefore(menuItem, stop);
  1135.         
  1136.        }
  1137. /*
  1138.        var XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
  1139.        var menu, menupopup, tag, id;
  1140.        for(var i=0; i<tags.length; i++) {
  1141.  
  1142.          var favTag = tags[i];
  1143.          id = "ybbookmarks_tags_toolbar_"+i;
  1144.  
  1145.          var menu = document.createElementNS(XULNS, "menu");
  1146.          menu.setAttribute("container", true);
  1147.          menu.setAttribute("id", id); 
  1148.          menu.setAttribute("label", favTag);
  1149.         // menu.setAttribute("order", order);
  1150.          menu.setAttribute("class", "menu-iconic yb-tag-item");
  1151.          menu.setAttribute("container", "true");
  1152.          menu.setAttribute("onpopupshowing", "ybookmarksMain._onFavoriteTagShowing(event);")
  1153.          
  1154.          menu.setAttribute("datasources", "rdf:null");
  1155.          menu.setAttribute("template", "ybookmarks_tags_toolbar_template");
  1156.          
  1157.          menupopup = document.createElementNS(XULNS, "menupopup");
  1158.          menupopup.setAttribute("contextmenu", "yb-bookmarks-context-menu");
  1159.          menu.appendChild(menupopup);         
  1160.          popup.insertBefore(menu, stop);
  1161.  
  1162.          var favTagResource = ybBags.isFavoriteTag(favTag);
  1163.          if (favTagResource) {
  1164.            favTagResource.QueryInterface(Components.interfaces.nsIRDFResource);
  1165.            menu.setAttribute("ref", favTagResource.Value);      
  1166.            menu.database.AddDataSource(this.gBookmarks.getDataSource());
  1167.          //  menu.builder.rebuild();
  1168.          }
  1169.          
  1170.        }
  1171. */
  1172.       } catch (e) { 
  1173.       yDebug.print("addTagsToolbarToMenu(): " + e, YB_LOG_MESSAGE);
  1174.      }
  1175.    },
  1176.  
  1177.    onBundlesPopupShowing: function (event) {
  1178.      var popup = event.target;
  1179.      var end = document.getElementById("ybookmarks_bundles_menubar_popup_end");
  1180.      
  1181.      while(popup.childNodes[0] != end) {
  1182.        popup.removeChild(popup.childNodes[0]);
  1183.      }
  1184.      
  1185.      var bundles = this.gBookmarks.getBundles({});
  1186.      for (var i=0; i < bundles.length; i++) {
  1187.        var b = bundles[i];
  1188.        var bArg = { name: b.name,
  1189.                     type: YB_TYPE_BUNDLE};
  1190.        var menuItem = ybBookmarksMenu.createMenuItem(bArg);
  1191.        
  1192.        popup.insertBefore(menuItem, end); 
  1193.      }
  1194.      
  1195.    },
  1196.    
  1197.    _getIntersectingBookmarks : function(favtags) {
  1198.      var intersected = [];
  1199.      
  1200.      var conUtils = Components.classes["@mozilla.org/rdf/container-utils;1"].
  1201.                        getService(Components.interfaces.nsIRDFContainerUtils);
  1202.     
  1203.      var bm = {};
  1204.      var numTags = 0;  // number of valid tags (e.g. no "")
  1205.      // combine all the resources of each favorite tag
  1206.      for(var j=0; j < favtags.length; j++) {
  1207.        var ft = favtags[j];
  1208.        if (ft == "") { continue; }
  1209.        numTags++;
  1210.        var ftRsrcName = this.gBookmarks.getTagResourceName(ft); // check if this tag is used
  1211.        if (ftRsrcName) {
  1212.          var ftRsrc = gYBRdfService.GetResource(ftRsrcName);
  1213.          // take all the bookmarks of this tag and append it to the root
  1214.          var con = conUtils.MakeSeq(this.gBookmarks.getDataSource(), ftRsrc);
  1215.          var enu = con.GetElements();
  1216.          while (enu.hasMoreElements()) {
  1217.            var r = enu.getNext();
  1218.            r.QueryInterface(Components.interfaces.nsIRDFResource);
  1219.            var key = r.Value;
  1220.            if (bm[key] == undefined) {
  1221.              bm[key] = {count: 1,
  1222.                          rsrc: r};
  1223.            } else {
  1224.              bm[key].count++;
  1225.            }
  1226.          }
  1227.        }
  1228.      }
  1229.      
  1230.      for each (b in bm) {
  1231.        if (b.count == numTags) {
  1232.          intersected.push(b.rsrc);
  1233.        }
  1234.      }
  1235.      return intersected;
  1236.    },
  1237.    
  1238.    /* kludge: as it seems, RSS feeds tend to be in reverse-chrono order.  The problem
  1239.       is that the datasource adds these livemakrs in order, so the newest has the oldest adddate.
  1240.       So: ascending add date -> descending actual date */
  1241.    reverseLivemarkMenu: function(menu) {
  1242.      if (!menu.getAttribute("reversed")) {
  1243.        var copy = new Array(menu.childNodes.length);
  1244.        var i = 0;
  1245.        while (menu.childNodes.length) {
  1246.          copy[i] = menu.removeChild(menu.firstChild);
  1247.          i++;
  1248.        }
  1249.        for (i=copy.length-1; i >=0 ; i--) {
  1250.          menu.appendChild(copy[i]);
  1251.        }
  1252.        menu.setAttribute("reversed", true);
  1253.      }
  1254.    },
  1255.    
  1256.    _getLivemarkAddDate: function (aLivemark) {
  1257.       var bm = this.gBookmarks.getBookmark(aLivemark.getAttribute("url"));
  1258.       bm.QueryInterface(Components.interfaces.nsIYBookmark)
  1259.       return bm.added_date;
  1260.    },
  1261.    
  1262.    sortLivemarkMenu: function(menu, aOrder) {
  1263.      //if (!menu.getAttribute("reversed")) {
  1264.        try {
  1265.        var copy = [];
  1266.        var i = 0;
  1267.        while (menu.childNodes.length) {
  1268.          var item = menu.removeChild(menu.firstChild);
  1269.          if (item.getAttribute("url")) {
  1270.            copy.push(item);
  1271.          }
  1272.        }
  1273.        var func = null;
  1274.        // remember that livemark items are processed in order of the xml file
  1275.        // so most recent items actually have an earlier add date
  1276.        if (aOrder == FAVTAGS_ORDER_CHRONO) { 
  1277.          func = function(a, b) { return ybookmarksMain._getLivemarkAddDate(b) - ybookmarksMain._getLivemarkAddDate(a) };
  1278.        } else if (aOrder == FAVTAGS_ORDER_CHRONO_REVERSE) {
  1279.          func = function(a, b) { return ybookmarksMain._getLivemarkAddDate(a) - ybookmarksMain._getLivemarkAddDate(b) };      
  1280.        } else if (aOrder == FAVTAGS_ORDER_ALPHANUM) {
  1281.           func = function(a, b) { return a.getAttribute("label").localeCompare(b.getAttribute("label")); };      
  1282.        } else if (aOrder == FAVTAGS_ORDER_ALPHANUM_REVERSE) {
  1283.           func = function(a, b) { return b.getAttribute("label").localeCompare(a.getAttribute("label")); };      
  1284.        } else if (aOrder == FAVTAGS_ORDER_USER) {
  1285.           func = null;
  1286.        }
  1287.      
  1288.        if (func) {
  1289.          copy.sort(func); 
  1290.        }
  1291.        
  1292.        for (var i=0; i < copy.length ; i++) {
  1293.          menu.appendChild(copy[i]);
  1294.        }
  1295.        //menu.setAttribute("reversed", true);
  1296.      //}
  1297.    } catch (e) {yDebug.print(e);}
  1298.    },
  1299.    
  1300.   /* _onFavoriteTagShowing : function(event) {
  1301.      try {
  1302.        
  1303.        var popup = event.target;
  1304.        var menu;
  1305.         if (popup.parentNode.id.indexOf("ybbookmarks_tags_toolbar_") != -1) {
  1306.            menu = popup.parentNode;  
  1307.        } else if (popup.parentNode.getAttribute("livemark")) {
  1308.           menu = popup.parentNode.parentNode.parentNode;  
  1309.        }
  1310.        var favTag = menu.getAttribute("label");
  1311.        var order = ybBags.getFavoriteTagOrder(favTag);
  1312.         var sortResource, sortDirection;
  1313.         if (order == FAVTAGS_ORDER_CHRONO) {
  1314.           sortResource = "http://home.netscape.com/NC-rdf#BookmarkAddDate";
  1315.           sortDirection = "ascending";
  1316.         }  else if (order == FAVTAGS_ORDER_CHRONO_REVERSE) {
  1317.           sortResource = "http://home.netscape.com/NC-rdf#BookmarkAddDate";
  1318.           sortDirection = "descending";  
  1319.         }  else if (order == FAVTAGS_ORDER_ALPHANUM) {
  1320.           sortResource = "http://home.netscape.com/NC-rdf#Name";
  1321.           sortDirection = "ascending";
  1322.         }  else if (order == FAVTAGS_ORDER_ALPHANUM_REVERSE) {
  1323.           sortResource = "http://home.netscape.com/NC-rdf#Name";
  1324.           sortDirection = "descending";
  1325.         } else if (order == FAVTAGS_ORDER_USER) {
  1326.           sortResource = null;
  1327.           sortDirection = null;
  1328.         }
  1329.      
  1330.        if (popup.parentNode.id.indexOf("ybbookmarks_tags_toolbar_") != -1) {
  1331.         
  1332.          while(popup.childNodes.length) {
  1333.            popup.removeChild(popup.lastChild);
  1334.          }
  1335.          
  1336.          if (sortResource) {
  1337.            menu.setAttribute("sortResource", sortResource);
  1338.            menu.setAttribute("sortDirection", sortDirection);
  1339.          }
  1340.          menu.builder.rebuild();
  1341.          
  1342.          if (popup.childNodes.length) { 
  1343.            YBtabsOpener.addMenuItem(popup);
  1344.          }
  1345.          else {
  1346.            ybookmark_Utils.addEmptyMenuItem(popup);
  1347.          }
  1348.      
  1349.          ybookmarks_Main.addPopularPageMenuItem(event);
  1350.       
  1351.        } else if (popup.parentNode.getAttribute("livemark")) {
  1352.           //this.sortLivemarkMenu(popup, FAVTAGS_ORDER_CHRONO_REVERSE);
  1353.           
  1354.           if (popup.childNodes.length) { 
  1355.              YBtabsOpener.addMenuItem(popup);
  1356.            }
  1357.        } 
  1358.      } catch (e) { 
  1359.        yDebug.print("_onFavoriteTagShowing():" + e);
  1360.      }
  1361.    },
  1362. */   
  1363.  
  1364.    loadRelevantPage : function(event, aStr, aMouseClick){
  1365.       var del = Components.classes[Y_kDelContractID]
  1366.                  .getService( Components.interfaces.nsISocialStore );
  1367.       
  1368.       var user = del.getUserName();
  1369.       var url = null;
  1370.       switch(aStr){
  1371.       case "login":
  1372.        if(!user)
  1373.             url = del.login_url;
  1374.          else
  1375.             url = deliciousService.getUrl("logout");
  1376.          break;
  1377.       case "logout":
  1378.          url = deliciousService.getUrl("logout");
  1379.          break;
  1380.       case "moreabout":
  1381.          if(!user)
  1382.             url = del.login_url;
  1383.          else
  1384.             url = deliciousService.getMoreAboutUrl(content.location);
  1385.          break;
  1386.       case "your":
  1387.          if(!user)
  1388.             url = del.login_url;
  1389.          else
  1390.             url = deliciousService.getUrl(user);
  1391.          break;
  1392.       case "network":
  1393.          if(!user)
  1394.             url = del.login_url;
  1395.          else
  1396.             url = deliciousService.getUrl("network/" + user);
  1397.          break;
  1398.       case "tags":
  1399.          if(!user)
  1400.             url = del.login_url;
  1401.          else
  1402.             url = deliciousService.getUrl("tags/" + user);
  1403.          break;
  1404.       case "subscriptions":
  1405.          if(!user)
  1406.             url = del.login_url;
  1407.          else
  1408.             url = deliciousService.getUrl("subscriptions/" + user);
  1409.          break;
  1410.       case "inbox":
  1411.       case "for":
  1412.          if(!user)
  1413.             url = del.login_url;
  1414.          else
  1415.             url = deliciousService.getUrl("for/" + user);
  1416.          break;
  1417.       case "settings":
  1418.          if(!user)
  1419.             url = del.login_url;
  1420.          else
  1421.             url = deliciousService.getUrl("settings/" +
  1422.                 user + "/profile");
  1423.          break;     
  1424.       case "homepage":
  1425.          url = deliciousService.getUrl("");
  1426.          break;
  1427.       case "popular":
  1428.          url = deliciousService.getUrl("popular/");  
  1429.          break;
  1430.       case "recent":
  1431.          url = deliciousService.getUrl("recent/");
  1432.          break;
  1433.       case "about":
  1434.          url = deliciousService.getUrl("about");
  1435.          break;
  1436.       case "help":
  1437.          url = deliciousService.getUrl("help/");
  1438.          break;
  1439.       case "tour":
  1440.          var strings = document.getElementById("ybookmarks-strings");
  1441.          url = deliciousService.getQuickTourUrl();
  1442.          break;
  1443.       case "bundles":
  1444.          url = deliciousService.getBundleUrl();
  1445.          break;
  1446.       case "editbundle":
  1447.         url = deliciousService.getEditBundleUrl(event.bundle);
  1448.         break;
  1449.       default:
  1450.          url = deliciousService.getUrl();
  1451.          break;
  1452.       }
  1453.       
  1454.       if (url) {
  1455.          this.UIloadPage(event, url, aMouseClick);
  1456.       }
  1457.    },
  1458.  
  1459.    UIloadPage : function(event, aUrl, aMouseClick){
  1460.    
  1461.      var browser = document.getElementById("content");
  1462.      if(aMouseClick){
  1463.        if(event.button == 1){
  1464.          if(event.target.localName == "menuitem") {
  1465.            var menu = event.target.parentNode;
  1466.            while( menu.localName == "menu" || menu.localName == "menupopup" ) {
  1467.              if( menu.localName == "menupopup" ) {
  1468.                menu.hidePopup();
  1469.              }
  1470.              menu = menu.parentNode;
  1471.            }
  1472.          }
  1473.          var tab = browser.addTab(aUrl);  
  1474.          browser.selectedTab = tab;
  1475.        }
  1476.      }
  1477.       else{
  1478.         if(!event){
  1479.           browser.loadURI(aUrl);
  1480.         
  1481.         return;
  1482.         }
  1483.         
  1484.         var shift = event.shiftKey;     
  1485.         var ctrl =  event.ctrlKey;                
  1486.         if (ctrl) {    
  1487.           var tab = browser.addTab(aUrl);  
  1488.           browser.selectedTab = tab;
  1489.         }
  1490.         else if(shift){
  1491.           openDialog("chrome://browser/content/browser.xul", "_blank", "chrome,all,dialog=no", aUrl);
  1492.         }
  1493.         else
  1494.           browser.loadURI(aUrl);
  1495.       }  
  1496.    
  1497.    return;
  1498.    },
  1499.     /* check for validity of user's cookie once on startup */
  1500.     checkUserLoggedInState:function(){
  1501.         var del = Components.classes[Y_kDelContractID].getService( Components.interfaces.nsISocialStore );
  1502.         var cb = {
  1503.         onload: function (event) {
  1504.          yDebug.print("ybookmarksOverlay.js::checkUserLoggedInState()=>Onload", YB_LOG_MESSAGE);            
  1505.         },        
  1506.         onerror: function (event) {
  1507.             if(event.target.status == 403 || event.target.status == 401) {
  1508.                 //do silent logout                
  1509.                 yDebug.print("ybookmarksOverlay.js::checkUserLoggedInState()=> Received 401 or 403 response from the server", YB_LOG_MESSAGE);
  1510.                  Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService)
  1511.            .notifyObservers(null, "ybookmark.userChanged", "triggerSilentLogout");   
  1512.             }
  1513.             yDebug.print("ybookmarksOverlay.js::checkUserLoggedInState()=>Error", YB_LOG_MESSAGE);
  1514.         }
  1515.         }
  1516.         del.lastUpdate(cb);
  1517.     },
  1518.     
  1519.    isEngineInstalled : function(){           
  1520.       var installed = false;
  1521.       var newVersionNum = this.strings.getString("extensions.ybookmarks.versionNum");
  1522.       try {
  1523.           var oldVersionNum = this.prefs.getCharPref("extensions.ybookmarks@yahoo.version.number");
  1524.       }catch (e){
  1525.           yDebug.print("ybookmarksOverlay.js::ybookmarksMain::isEngineInstalled()=>Engine not installed",
  1526.               YB_LOG_MESSAGE);
  1527.       }               
  1528.       if(newVersionNum == oldVersionNum){
  1529.           installed = true;
  1530.           yDebug.print("ybookmarksOverlay.js::ybookmarksMain::isEngineInstalled()=>Engine installed",
  1531.               YB_LOG_MESSAGE);
  1532.            
  1533.          }
  1534.          return installed;         
  1535.    },
  1536.    
  1537.  
  1538.    installEngine : function() {
  1539.      yDebug.print("ybookmarksOverlay.js::ybookmarksMain::installEngine()=> Installing Engine...",YB_LOG_MESSAGE);          
  1540.      // Create delicious XT session cookie
  1541.      /*
  1542.      ybookmarksUtils.setCookie(DEL_COOKIE_NAME, DEL_COOKIE_URL, DEL_COOKIE_DOMAIN,
  1543.          DEL_COOKIE_DATA, DEL_COOKIE_EXPIERE_AFTER_DAYS);         */
  1544. /*
  1545.          var tourURL = deliciousService.getTourUrl();
  1546.           yDebug.print("ybookmarksOverlay.js::ybookmarksMain::installEngine()=> Redirecting to: "
  1547.             + tourURL, YB_LOG_MESSAGE);
  1548.         setTimeout(
  1549.             function(aUrl){
  1550.                 try {
  1551.                   var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
  1552.                                      .getService(Components.interfaces.nsIWindowMediator);
  1553.                   var browserEnumerator = wm.getEnumerator("navigator:browser");
  1554.                 
  1555.                   // Check each browser instance for our URL
  1556.                   var found = false;
  1557.                   while (!found && browserEnumerator.hasMoreElements()) {
  1558.                     var browserInstance = browserEnumerator.getNext().getBrowser();
  1559.                 
  1560.                     // Check each tab of this browser instance
  1561.                     var numTabs = browserInstance.tabContainer.childNodes.length;
  1562.                     for(var index=0; index<numTabs; index++) {
  1563.                       var currentBrowser = browserInstance.getBrowserAtIndex(index);
  1564.                       if (deliciousService.getRegisterSuccessUrl() == currentBrowser.currentURI.spec) {
  1565.                         // The URL is already opened. Select this tab.
  1566.                         browserInstance.selectedTab = browserInstance.tabContainer.childNodes[index];                
  1567.                         // Focus *this* browser
  1568.                         browserInstance.focus();                        
  1569.                         browserInstance.removeTab(browserInstance.selectedTab);                        
  1570.                         found = true;
  1571.                         break;
  1572.                       }
  1573.                     }
  1574.                   }
  1575.                   
  1576.                   browserInstance.addTab(aUrl);
  1577.                 } catch(e) {
  1578.                     yDebug.print("Except: "+e, YB_LOG_MESSAGE);
  1579.                 }
  1580.                 }, 
  1581.             200, tourURL
  1582.          );
  1583. */     
  1584.     /** Disabled for now **
  1585.     // Always show tagometer dialog if we upgrade to or install 2.0
  1586.     var currentVersionNum = this.strings.getString("extensions.ybookmarks.versionNum");
  1587.     var versionChecker = Components.classes["@mozilla.org/xpcom/version-comparator;1"].getService(Components.interfaces.nsIVersionComparator);
  1588.     if (versionChecker.compare(currentVersionNum, "2.0.00") >= 0) {
  1589.         yDebug.print("ybookmarksOverlay.js::ybookmarksMain::installEngine()=> Invoking Tagometer Dialog", YB_LOG_MESSAGE);
  1590.         var button_number = showEnableTagometerDialog();
  1591.         if(button_number == 0) { // user selected enable tagometer
  1592.             this.prefs.setBoolPref("extensions.ybookmarks@yahoo.statusbaricons.include_tagometer", true);
  1593.         }
  1594.     }
  1595.     */
  1596.     this.firstTimeStart();         
  1597.     
  1598.     //For intro Wizard.
  1599.     try {
  1600.          if(this.prefs.getBoolPref("extensions.ybookmarks@yahoo.engine.installed")) {
  1601.             //return true;
  1602.          } else {
  1603.             //Wizard not installed
  1604.             var rv = new Object();
  1605.             rv.aborted = false;
  1606.             window.openDialog("chrome://ybookmarks/content/introWiz.xul", "options", 
  1607.                                 "centerscreen,modal", rv);
  1608.             //Sets the toolbar icons    
  1609.             if (rv.aborted) {
  1610.                yDisableExtensions.uninstallYBookmarks();
  1611.                ybookmarksUtils.restartBrowser();
  1612.                return false;
  1613.             }
  1614.            
  1615.          }
  1616.     } catch(e){}
  1617.     return true;
  1618.    },  
  1619.  
  1620.    onTagsMenuPopupShowing: function(event) {
  1621.      try {
  1622.          var popup = event.target;
  1623.          while(popup.childNodes.length) {
  1624.            popup.removeChild(popup.lastChild);
  1625.          }
  1626.          var tags = ybookmarksMain.gBookmarks.getTags(null, {});
  1627.          tags.sort(function(a,b) { return a.localeCompare(b); });
  1628.          for (var i=0; i < tags.length; i++) {
  1629.            var tag = tags[i];
  1630.            var tagArg = { name: tag,
  1631.                           type: YB_TYPE_TAG,
  1632.                           menubar: true,
  1633.                           order: FAVTAGS_ORDER_ALPHANUM };
  1634.            var item = ybBookmarksMenu.createMenuItem(tagArg);
  1635.            popup.appendChild(item);
  1636.          }
  1637.      } catch (e) {
  1638.       yDebug.print("onTagsMenuPopupShowing(): " + e);
  1639.      }
  1640.      
  1641.    },
  1642.    /*
  1643.    rebuildTagsMenu: function(event) {
  1644.      
  1645.      if ( ybookmarksMain.isNewTagAdded && !ybookmarksMain.isChangingDatasource) {
  1646.        
  1647.        var target = document.getElementById("ybookmarks_tags_1");
  1648.        if ((event && event.target.parentNode.id == "ybookmarks_tags_1") || 
  1649.           (!event && target.getAttribute("open") != "true")) {
  1650.          yDebug.print("===>Rebuilding My Tags ", YB_LOG_MESSAGE);
  1651.          target.builder.rebuild();
  1652.          ybookmarksMain.isNewTagAdded = false;
  1653.        }  
  1654.      }
  1655.    },*/
  1656.    
  1657.    
  1658.    /*
  1659.    showTagsToolbarMenu: function(event, menuElement) {
  1660.       
  1661.     if (event.target.parentNode.id == "ybookmarks_tags_toolbar") {
  1662.         
  1663.        this._refreshTagsToolbarMenuDatasource();
  1664.       
  1665.        var menupopup = event.target;
  1666.        var item = document.createElement( "menuseparator" );
  1667.        item.setAttribute("nontag", "true");
  1668.        menupopup.appendChild(item);
  1669.         
  1670.        var item = document.createElement("menuitem");
  1671.        item.setAttribute("class", YB_MENUITEM_NOICON);
  1672.        item.setAttribute("label", this.strings.getString("extensions.ybookmarks.toolbar.editor.label"));
  1673.        item.setAttribute("command", "cmd_yb_open_toolbar_editor");
  1674.        item.setAttribute("nontag", "true");
  1675.        menupopup.appendChild(item);
  1676.         
  1677.        var item = document.createElement("menuitem");
  1678.        item.setAttribute("class", YB_MENUITEM_NOICON);
  1679.        item.setAttribute("label", this.strings.getString("extensions.ybookmarks.toolbar.show.label"));
  1680.        //item.setAttribute("oncommand", "try {document.getElementById('ybToolbar').hidden=false;} catch(e) {alert(e);}");
  1681.        item.setAttribute("nontag", "true");
  1682.        menupopup.appendChild(item);
  1683.     }
  1684.   },
  1685.    
  1686.    hideTagsToolbarMenu : function(event) {
  1687.      
  1688.      if (event.target.parentNode.id == "ybookmarks_tags_toolbar") {
  1689.      
  1690.        var menupopup = event.target; 
  1691.        var item = menupopup.lastChild;
  1692.        while (item) {
  1693.          mitem = item;
  1694.          item = item.previousSibling;
  1695.          if (mitem.getAttribute("nontag") == "true") {
  1696.            menupopup.removeChild(mitem);
  1697.          }
  1698.        }
  1699.      }
  1700.    },
  1701.    */
  1702.    
  1703.    /*
  1704.    rebuildBookmarksMenu: function(event, menuElement) {
  1705.      if ( ybookmarksMain.isBookmarkChanged ) {
  1706.        menuElement.builder.rebuild();
  1707.        ybookmarksMain.isBookmarkChanged = false;
  1708.      }
  1709.    },
  1710.    */
  1711.    
  1712.    /*
  1713.    onMainPopupShowing: function(event) {
  1714.      
  1715.      ybookmarks_Main.addEmptyMenuItem( event );
  1716.      if ( this.isBookmarkChanged) {
  1717.        ybookmarks_Main.addBookmarkItemsToMainMenu();
  1718.        this.isBookmarkChanged = false;
  1719.      }
  1720.    },
  1721.    */
  1722.   
  1723.    onFrequentMenuPopupShowing: function(event) {
  1724.      var total = ybookmarks_Main.addBookmarksToPopup(event.target, 'bookmark-sort-tree-visitcount-col'); 
  1725. /*     if (ybookmarksMain._is_frequent_menu_update_required ) { 
  1726.        var total = ybookmarks_Main.addBookmarksToPopup(event.target, 'bookmark-sort-tree-visitcount-col'); 
  1727.        ybookmarksMain._is_frequent_menu_update_required = (total  == 0);
  1728.      }*/
  1729.    },
  1730.  
  1731.    /*
  1732.    onRecentMenuPopupShowing: function(event) {
  1733.      if (ybookmarksMain._is_recent_menu_update_required ) {
  1734.        ybookmarks_Main.addBookmarksToPopup(event.target, 'bookmark-sort-tree-visitdate-col'); 
  1735.        ybookmarksMain._is_recent_menu_update_required = false; 
  1736.      }
  1737.    },
  1738.    */
  1739.  
  1740.    onRecentlySavedMenuPopupShowing: function(event) {
  1741.       var total = ybookmarks_Main.addBookmarksToPopup(event.target, 'bookmark-sort-tree-adddate-col'); 
  1742.      
  1743.      /*if (ybookmarksMain._is_recently_saved_menu_update_required ) {
  1744.        var total = ybookmarks_Main.addBookmarksToPopup(event.target, 'bookmark-sort-tree-adddate-col'); 
  1745.        ybookmarksMain._is_recently_saved_menu_update_required = ( total == 0 );
  1746.      }*/
  1747.    },
  1748.  
  1749.    /*
  1750.    startImport: function (addTagsAsArray, addPopularTags, replaceDuplicates, filePath) {
  1751.       ybookmarksUtils.startImport(addTagsAsArray, addPopularTags, replaceDuplicates, filePath);  
  1752.    },
  1753.    */
  1754.    
  1755.    openImportProgress: function (data) {
  1756.          window.openDialog("chrome://ybookmarks/content/importProgress.xul", "yb-import-progress", "centerscreen", data);
  1757.    },
  1758.    
  1759.    _importBookmarksObserver: {
  1760.      
  1761.      observe: function(subject, topic, data) {
  1762.      
  1763.        try {           
  1764.          if (topic == "ybookmark.importBookmarks") {
  1765.            yDebug.print("ybookmarksOverlay.js::_importBookmarksObserver()=> Inside import observer....",
  1766.                    YB_LOG_MESSAGE);
  1767.  
  1768.            var pgrText = document.getElementById("ybookmark-import-progresstext" );
  1769.            var pgrMeter = document.getElementById("ybookmark-import-progressmeter" );
  1770.            var pgrStatus = document.getElementById("ybookmark-import-progress-statusbarpanel" );
  1771.            var strings = document.getElementById( "ybookmarks-strings" );
  1772.            
  1773.            subject.QueryInterface(Components.interfaces.nsISupportsString);
  1774.      
  1775.            /* display the import progress on statusbar */
  1776.            if (subject.data == "startImport") {
  1777.              pgrStatus.collapsed = false;
  1778.              pgrText.collapsed = false;
  1779.              pgrMeter.collapsed = false;
  1780.              pgrText.value = strings.getString( "extensions.ybookmarks.statusbar.importing" );
  1781.            }
  1782.            else if (subject.data == "importProgress") {
  1783.            
  1784.              switch (data) {
  1785.                
  1786.                case "complete":
  1787.                  pgrMeter.collapsed = true;
  1788.                  pgrStatus.collapsed = false;
  1789.      pgrText.collapsed = false;
  1790.                  pgrText.value = strings.getString( "extensions.ybookmarks.statusbar.importdone" );
  1791.                  setTimeout(function(){  
  1792.                      //only hide this if "importing successfully" text is showing
  1793.                      if (pgrText.value == strings.getString( "extensions.ybookmarks.statusbar.importdone" )) {
  1794.                        pgrStatus.collapsed = true;
  1795.                        pgrText.collapsed = true;
  1796.                        pgrMeter.collapsed = true;
  1797.                      }
  1798.                    }, 30000);
  1799.                break;
  1800.                case "importing":
  1801.                  pgrStatus.collapsed = false;
  1802.                  pgrText.collapsed = false;
  1803.                  pgrMeter.collapsed = false;
  1804.                  pgrText.value = strings.getString( "extensions.ybookmarks.statusbar.importing" )
  1805.                break;
  1806.                case "failed":
  1807.                  pgrMeter.collapsed = true;               
  1808.                  pgrText.value = strings.getString( "extensions.ybookmarks.statusbar.importfailed" );
  1809.                break;
  1810.              }
  1811.            }
  1812.            else if (subject.data == "importError") {
  1813.              pgrMeter.collapsed = true;           
  1814.              pgrText.value = strings.getString( "extensions.ybookmarks.statusbar.importfailed" );
  1815.            }
  1816.            
  1817.  
  1818.            /* this guarantees that having multiple windows won't cause problems. */
  1819.            var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"].
  1820.                  getService(Components.interfaces.nsIWindowMediator);
  1821.            var recentWindow = wm.getMostRecentWindow("navigator:browser");
  1822.            if (recentWindow != window) {
  1823.              return;
  1824.            }
  1825.            /*
  1826.            var winEnumerator = wm.getEnumerator("navigator:browser");
  1827.            var isFirstWindow = (winEnumerator.getNext() == window);
  1828.            if (!isFirstWindow) {
  1829.              return;
  1830.            }
  1831.            */
  1832.            if (subject.data == "startImport") {
  1833.                 if(!ybookmarksUtils.isRecentWindow()) { //To make sure that import is initiated by recent window alone
  1834.                     return;
  1835.                 }
  1836.              try {
  1837.                var dataString = new String(data);
  1838.                var args = YBJSON.parse(dataString);
  1839.  
  1840.                var addTags = args.addTags;
  1841.                var addPopularTags = args.addPopularTags;
  1842.                var replaceDuplicates = args.replaceDuplicates; 
  1843.                var email = args.email;
  1844.                var priv = args.priv;
  1845.  
  1846.                if (args.filePath != null) { // check for null, not "".  "" means Firefox's bookmarks.html                 
  1847.                  setTimeout ( function() { ybookmarksUtils.startImport(addTags, addPopularTags, replaceDuplicates, args.filePath, email, priv); }, 0);
  1848.                } else if (args.bookmarksString){                 
  1849.                  setTimeout ( function() { ybookmarksUtils.startImportWithBookmarksString(addTags, addPopularTags, replaceDuplicates, args.bookmarksString, email, priv); }, 0);
  1850.                }
  1851.              } catch (e) { 
  1852.               yDebug.print(e, YB_LOG_MESSAGE);
  1853.              }
  1854.                 
  1855.            } else if (subject.data == "importProgress") {  
  1856.              //complete", "importing" or "failed    
  1857.              if (data == "complete" || data == "failed") {
  1858.                if (data == "complete" && ybookmarksMain.isEngineInstalled()) {
  1859.                  ybookmarksMain.syncservice.sync(false);
  1860.                }
  1861.                   
  1862.                if (ybookmarksMain.isBookmarkImportPolling()) {
  1863.                  ybookmarksMain.openImportProgress(data);
  1864.                  ybookmarksMain.setBookmarkImportPolling(false);
  1865.                }   
  1866.              } else {
  1867.                setTimeout(function() {
  1868.                     var ssr = 
  1869.                         Components.classes["@yahoo.com/socialstore/delicious;1"].
  1870.                            getService(Components.interfaces.nsISocialStore);    
  1871.                     ssr.getImportStatus(ybookmarksUtils.importStatusCallback); }, 
  1872.                     Y_BOOKMARKS_IMPORT_POLLING_PERIOD);
  1873.               } 
  1874.             } else if (subject.data == "importError") {
  1875.               ybookmarksMain.openImportProgress("failed");
  1876.               ybookmarksMain.setBookmarkImportPolling(false);
  1877.             }
  1878.           }
  1879.           
  1880.        } catch (e) { 
  1881.          yDebug.print("importBookmarksObserver: " + e, YB_LOG_MESSAGE);
  1882.        }
  1883.      }      
  1884.    },
  1885.    
  1886.    importBookmarks: function() {
  1887.      
  1888.      if(!YBidManager.isUserLoggedIn()) {
  1889.        YBidManager.promptUserLogin();
  1890.        try {
  1891.           if (window.ybLoginWindowFlag == "display") {
  1892.              YBPopupWindow.showLoginWindow();
  1893.           }
  1894.        } catch(e) {
  1895.             // do nothing
  1896.        }
  1897.        return;
  1898.      }  
  1899.  
  1900.      var callback = {
  1901.        _ybookmarksMain: null,
  1902.        
  1903.        onload: function(result) {
  1904.           var propertyBag = result.queryElementAt(0, Components.interfaces.nsIPropertyBag);
  1905.           var status = propertyBag.getProperty("status");  
  1906.           //"complete", "importing" or "failed"
  1907.           if (status == "importing") {
  1908.               ybookmarksMain.openImportProgress("importing");  
  1909.               if (!this._ybookmarksMain.isBookmarkImportPolling()) {
  1910.                 this._ybookmarksMain.setBookmarkImportPolling(true);      
  1911.                 setTimeout(function() {    
  1912.                             var ssr = Components.classes["@yahoo.com/socialstore/delicious;1"].
  1913.                               getService(Components.interfaces.nsISocialStore);
  1914.                             ssr.getImportStatus(ybookmarksUtils.importStatusCallback); }, 
  1915.                           Y_BOOKMARKS_IMPORT_POLLING_PERIOD);
  1916.               }
  1917.           
  1918.           } else {
  1919.             this._ybookmarksMain.setBookmarkImportPolling(false);      
  1920.             window.openDialog("chrome://ybookmarks/content/importBookmarks.xul", "yb-import-bookmarks", 
  1921.                                 "chrome,centerscreen");
  1922.           }
  1923.        },
  1924.        onerror: function(event) {
  1925.        }      
  1926.      };
  1927.  
  1928.      var ssr = Components.classes["@yahoo.com/socialstore/delicious;1"].
  1929.              getService(Components.interfaces.nsISocialStore);         
  1930.      callback._ybookmarksMain = this;
  1931.      ssr.getImportStatus(callback);     
  1932.    },
  1933.  
  1934.    forceRefresh: function() {     
  1935.        //TODO: Implement better solution to workaround sync failure.
  1936.        var del = Components.classes[Y_kDelContractID].getService( Components.interfaces.nsISocialStore );
  1937.        var cb = {
  1938.             onload: function (event) {
  1939.                  yDebug.print("ybookmarksOverlay.js::forceRefresh()=>Onload");            
  1940.                  ybookmarksMain.gBookmarks.deleteAllBookmarks(false);
  1941.                  ybookmarksMain.gBookmarks.clearBundles();
  1942.                  //TODO: Do we need to clean fav tags?
  1943.                  ybookmarksMain.gBookmarks.cleanOutFavoriteTags();
  1944.                  ybToolbar.refreshCurrentView();
  1945.                  ybookmarksMain.gBookmarks.setLastUpdateTime("");
  1946.                  ybookmarksMain.syncservice.sync(false);
  1947.             },        
  1948.             onerror: function (event) {
  1949.                 yDebug.print("ybookmarksOverlay.js::forceRefresh()=>OnError", YB_LOG_MESSAGE);
  1950.                 var obsService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
  1951.                 obsService.notifyObservers(null, "ybookmark.syncBegin", "no-update");
  1952.                 obsService.notifyObservers(null, "ybookmark.syncDone", "sync-aborted");
  1953.             }
  1954.        }     
  1955.        del.lastUpdate(cb);
  1956.    },
  1957.  
  1958.    /**
  1959.     * Set the UI based on the login state 
  1960.     */   
  1961.    setLoginState : function() {
  1962.       
  1963.       var socialStore = Components.classes[Y_kDelContractID]
  1964.                  .getService( Components.interfaces.nsISocialStore );
  1965.  
  1966.       var username = socialStore.getUserName();
  1967.       if (username) {
  1968.         YBidManager.setLastUsername(username);
  1969.         this.setLoggedInState (username)
  1970.       }
  1971.       else {
  1972.         this.setLoggedOutState();
  1973.       }
  1974.    },
  1975.    
  1976.    setLoggedInState : function(username) {
  1977.  
  1978.      var loggedInElement =  document.getElementById("ybookmarks_loggedin_menu");
  1979.      var loginElement =  document.getElementById("ybookmarks_login_menuitem");
  1980.      var pgrStatus = document.getElementById("ybookmark-import-progress-statusbarpanel" );
  1981.    
  1982.      if (loggedInElement) {
  1983.        if (this.strings) {
  1984.          loggedInElement.setAttribute("label", this.strings.getFormattedString("ybookmarks.loggedInAs", [username]));
  1985.        }
  1986.        loggedInElement.hidden = false;
  1987.      }
  1988.      if (loginElement) {
  1989.        loginElement.hidden = true;
  1990.      }
  1991.      if (pgrStatus) {
  1992.        pgrStatus.hidden = false;
  1993.      }
  1994.    },
  1995.    
  1996.    setLoggedOutState : function() {
  1997.      var loggedInElement =  document.getElementById("ybookmarks_loggedin_menu");
  1998.      var loginElement =  document.getElementById("ybookmarks_login_menuitem");
  1999.      var pgrStatus = document.getElementById("ybookmark-import-progress-statusbarpanel" );
  2000.      
  2001.      loggedInElement.hidden = true;
  2002.      loginElement.hidden = false;
  2003.      if (pgrStatus) {
  2004.        pgrStatus.hidden = true;
  2005.      }
  2006.    },
  2007.  
  2008.    delMenuShowing: function( menu ) {
  2009.       var i, val;
  2010.       var debugMode = yDebug.on( true );
  2011.       for(i = 0; i < menu.childNodes.length; ++i ) {
  2012.          val = ( menu.childNodes[ i ] ).getAttribute( "yb_debugModeOnly" );
  2013.          if( val && ( val == "true" ) ) {
  2014.             ( menu.childNodes[ i ] ).hidden = !debugMode;
  2015.          }
  2016.       }
  2017.    },
  2018.    
  2019.    _addBookmarkObserver: {
  2020.        observe: function(subject, topic, data) {
  2021.          if (topic == "ybookmark.addBookmark") {
  2022.              if(data) {
  2023.                 setTimeout( function() {yAddBookMark.open(data);} , 650);
  2024.              } else {
  2025.                 setTimeout( function() {yAddBookMark.open( "", "", null, null, null, null, true );} , 650);
  2026.              }
  2027.          }
  2028.        }
  2029.     },
  2030.    
  2031.     _disableExtensionObserver: {
  2032.        observe: function(subject, topic, data) {
  2033.          if (topic == "ybookmark.disableExtension") {
  2034.             var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"].
  2035.                   getService(Components.interfaces.nsIWindowMediator);
  2036.             var recentWindow = wm.getMostRecentWindow("navigator:browser");
  2037.             
  2038.             
  2039.             if (recentWindow == window) {
  2040.               if (data == "cancel") {
  2041.                // cmyang: 2006-10-26 don't know why, but the timeout is necc, 
  2042.                // otherwise Fx 1.5 o Mac crashes on shutdown
  2043.               yDebug.print("Disabling bookmonkey");
  2044.               setTimeout(
  2045.                  function() {yDisableExtensions.disableYBookmarks();}, 0);
  2046.               } else if (data == "accept") {
  2047.                 yDebug.print("Disabling non-compatible extensions");
  2048.                 setTimeout ( function() {ybookmarksUtils.restartBrowser(); }, 0);
  2049.               }
  2050.              }
  2051.           }
  2052.        }
  2053.     },
  2054.     
  2055.    _errorObserver: {
  2056.      observe: function(subject, topic, data) {
  2057.        
  2058.        var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"].
  2059.                         getService(Components.interfaces.nsIWindowMediator);
  2060.        var recentWindow = wm.getMostRecentWindow("navigator:browser");
  2061.        if (recentWindow == window) {
  2062.         if (topic == "ybookmark.serverError") {
  2063.            var dataObject = YBJSON.parse(data);
  2064.            window.openDialog(
  2065.              "chrome://ybookmarks/content/serverError.xul", 
  2066.              "server-error-dialog",
  2067.              "chrome,dialog,centerscreen,modal,resizable=no",
  2068.              dataObject);
  2069.          }
  2070.        }
  2071.        
  2072.      }
  2073.    },
  2074.    
  2075.    // initiates an import based on import cookie
  2076.    _importBookmarks : function(importCookie){
  2077.     
  2078.     try {
  2079.     var decodedCookieData = decodeURIComponent(importCookie.value);
  2080.     yDebug.print("Import Cookie : " + decodedCookieData, YB_LOG_MESSAGE);
  2081.     var cookieData =  decodedCookieData.split("|");
  2082.     var map = new Object();
  2083.     for(i=0;i<cookieData.length;i++){
  2084.         var pair = cookieData[i].split("=");
  2085.         map[pair[0]]=pair[1];
  2086.     }
  2087.     var tagsArray = map["usertags"] ? map["usertags"].split("+") : [];
  2088.     // TBD: handle easy vs custom and test import
  2089.     var args = YBJSON.stringify({ addTags: ((map.add_tags == 1) ? tagsArray : []), 
  2090.                                 addPopularTags: (map.pop_tags ==1), 
  2091.                                 replaceDuplicates: (map.duplicate==0), 
  2092.                                 filePath: "", email:(map.email), priv:(map.priv)});
  2093.                                    
  2094.       var xpcArgs = Components.classes["@mozilla.org/supports-string;1"].
  2095.                   createInstance(Components.interfaces.nsISupportsString);
  2096.       var xpcSubject = Components.classes["@mozilla.org/supports-string;1"].
  2097.                       createInstance(Components.interfaces.nsISupportsString);
  2098.       xpcSubject.data = "startImport";
  2099.       xpcArgs.data = args;
  2100.      var os = Components.classes["@mozilla.org/observer-service;1"]
  2101.                                    .getService(Components.interfaces.nsIObserverService);                
  2102.        os.notifyObservers(xpcSubject, "ybookmark.importBookmarks", xpcArgs);
  2103.     } catch (e) {
  2104.         yDebug.print("ybookmarksOverlay.js::_importBookmarks()=> Exception: "+e, YB_LOG_MESSAGE);
  2105.     }
  2106.    },
  2107.    _cookieObserver: {
  2108.      observe: function(subject, topic, data) {
  2109.          if(!ybookmarksUtils.isRecentWindow()) {
  2110.              yDebug.print("ybookmarksOverlay.js::_cookieObserver()=> Returning quietly as this is not recentWindow. ");
  2111.              return;
  2112.          }         
  2113.         if (data == "added" || data == "changed") {
  2114.           try {
  2115.             var cookie = subject.QueryInterface ( Components.interfaces.nsICookie );
  2116.             var prefDomain = ybookmarksUtils._DOTCOMHOST;
  2117.             yDebug.print("ybookmarksOverlay.js::_cookieObserver()=> cookie name = " +cookie.name+" cookie host = "+cookie.host+" pref domain = "+prefDomain);
  2118.             // $$$ temporary code (adding "." for testing
  2119.             if (cookie.host == prefDomain && cookie.name == DEL_COOKIE_EXT_IMPORT) {
  2120.                 yDebug.print("ybookmarksOverlay.js::_cookieObserver=>Import Cookie Added or Modified",
  2121.                     YB_LOG_MESSAGE);
  2122.                    if (YBidManager.isUserLoggedIn()){
  2123.                        //Start import after a import status poll check.
  2124.                        setTimeout( function() {
  2125.                            try {
  2126.                                ybookmarksMain._startImportAfterPolling(cookie);
  2127.                            } catch(e) {
  2128.                                yDebug.print("exception on ybookmarksOverlay.js::_cookieObserver=>_startImportAfterPolling", YB_LOG_MESSAGE);
  2129.                            }
  2130.                        }, 
  2131.                        0);
  2132.                     //ybookmarksMain._importBookmarks(cookie);
  2133.                 }
  2134.             }
  2135.             //This is safe, if user sign-in in any, allow sync
  2136.             if ( (cookie.host == prefDomain  || cookie.host == ybookmarksUtils._DOTUSHOST) && cookie.name == "_user") {                
  2137.                 yDebug.print("ybookmarksOverlay.js::_cookieObserver()=> _user cookie added",YB_LOG_MESSAGE);
  2138.                 // If user cookie is added and engine is installed allow sync
  2139.                 if (ybookmarksMain.isEngineInstalled()) {
  2140.                     yDebug.print("ybookmarksOverlay.js::_cookieObserver()=> allowing sync...",YB_LOG_MESSAGE);
  2141.                     var ss = Components.classes["@mozilla.org/ybookmarks-sync-service;1"]
  2142.                         .getService(Components.interfaces.nsIYBookmarkSyncService);
  2143.                     ss.allowSync();
  2144.                 }
  2145.              }            
  2146.           } catch ( e ) {
  2147.             yDebug.print("ybookmarksOverlay.js::_cookieObserver()=>Exception: " + e,YB_LOG_MESSAGE);
  2148.           }
  2149.         }
  2150.       }
  2151.     },
  2152.     
  2153.     /**
  2154.      * Function opens new dialog for jump to tags
  2155.      */ 
  2156.     jumpToTag: function() {
  2157.         if(YBidManager.isUserLoggedIn() && ybookmarksUtils.getExtensionMode() == YB_EXTENSION_MODE_STANDARD) {
  2158.             var win = window.openDialog( "chrome://ybookmarks/content/ybJump.xul",
  2159.                    "",
  2160.                    "chrome,centerscreen,modal,dialog=no,resizable=no");
  2161.         }
  2162.     },
  2163.     
  2164.     /**
  2165.      * Function opens new dialog showing delicious options
  2166.      */
  2167.      showDeliciousOptions: function () {    
  2168.         if (!gPrefsWindow || gPrefsWindow.closed) {
  2169.             gPrefsWindow = window.openDialog("chrome://ybookmarks/content/options.xul", "Delicious Options","chrome,titlebar,toolbar,centerscreen,dialog=no");
  2170.             gPrefsWindow.focus();
  2171.         } else {
  2172.             gPrefsWindow.focus(); 
  2173.         }
  2174.      }
  2175. };
  2176.  
  2177. function yb_restoreBookmarks(backup) {
  2178.     var root = RDF.GetResource("NC:BookmarksRoot");
  2179.     BMDS.beginUpdateBatch();
  2180.     if (RDFCU.IsSeq(BMDS, root)) {
  2181.         var seq = RDFCU.MakeSeq(BMDS, root);
  2182.         var seqElements = seq.GetElements();
  2183.         /* remove all children of this folder. */
  2184.         while (seqElements.hasMoreElements()) {
  2185.             var resource = seqElements.getNext();
  2186.             resource.QueryInterface(Components.interfaces.nsIRDFResource);
  2187.             var selection = BookmarksUtils.getSelectionFromResource(resource, root);
  2188.             if (!selection.containsPTF) {
  2189.                 BookmarksController.doCommand("cmd_delete", selection);
  2190.             }
  2191.         }
  2192.     }  
  2193.     BMDS.endUpdateBatch();
  2194.     var sidebar = document.getElementById("sidebar-box");
  2195.     // close sidebar.
  2196.     if (!sidebar.hidden) {
  2197.         toggleSidebar('viewYBookmarksSidebar', false);
  2198.     }
  2199.     var ds = Components.classes["@mozilla.org/file/directory_service;1"].
  2200.         createInstance(Components.interfaces.nsIProperties);
  2201.     var extraFile = ds.get("ProfD", Components.interfaces.nsIFile);
  2202.     // delete extra.rdf
  2203.     extraFile.append("extra.rdf");
  2204.     if (extraFile.exists()) {
  2205.         extraFile.remove(false);
  2206.     }     
  2207.      
  2208.     //in case the file is not deleted
  2209.     var localStoreService = Components.classes["@mozilla.org/ybookmarks-store-service;1"].
  2210.             getService(Components.interfaces.nsIYBookmarksStoreService);                          
  2211.     localStoreService.setLastUpdateTime("-1");
  2212.      
  2213.       /* import the backup file. */
  2214.       /* import bookmarks from backup.  */
  2215.       RDFC.Init(BMDS, root);
  2216.      
  2217.       var countBefore =
  2218.         parseInt(BookmarksUtils.getProperty(root, gRDF_NS + "nextVal"));
  2219.       var args = [{ property: gNC_NS + "URL", literal: backup.path}];
  2220.       var is18branch = false;
  2221.       
  2222.       BookmarksCommand.doBookmarksCommand(root, gNC_NS_CMD + "import", args);
  2223.       
  2224.       var countAfter = parseInt(BookmarksUtils.getProperty(root, gRDF_NS + "nextVal"));
  2225.       
  2226.       try {
  2227.          if (gBkmkTxnSvc) {
  2228.             is18branch = true;
  2229.          }
  2230.       } catch (e) {}
  2231.       
  2232.       if (is18branch) {
  2233.          /* 1.8 branch. */
  2234.          if (countAfter - countBefore > 1) {
  2235.             gBkmkTxnSvc.startBatch();
  2236.          }
  2237.          
  2238.          for (var i = countBefore; i < countAfter; i++) {
  2239.             var nChildArc = RDFCU.IndexToOrdinalResource(i);
  2240.             var rChild = BMDS.GetTarget(root, nChildArc, true);
  2241.             
  2242.             gBkmkTxnSvc.createAndCommitTxn(
  2243.                gBkmkTxnSvc.IMPORT, "IMPORT", rChild, i, root, 0, null);
  2244.          }
  2245.          
  2246.          if (countAfter - countBefore > 1) {
  2247.             gBkmkTxnSvc.endBatch();
  2248.          }
  2249.       } else {
  2250.          /* 1.7 branch. */
  2251.          var transaction = new BookmarkImportTransaction("import");
  2252.          
  2253.          for (var i = countBefore; i < countAfter; i++) {
  2254.             var nChildArc = RDFCU.IndexToOrdinalResource(i);
  2255.             var rChild = BMDS.GetTarget(root, nChildArc, true);
  2256.             
  2257.             transaction.item.push(rChild);
  2258.             transaction.parent.push(root);
  2259.             transaction.index.push(i);
  2260.          }
  2261.          
  2262.          BMSVC.transactionManager.doTransaction(transaction);
  2263.       }   
  2264.       var currentToolbarFolder = BMSVC.getBookmarksToolbarFolder();
  2265.       var currentTFSelection =
  2266.          BookmarksUtils.getSelectionFromResource(currentToolbarFolder, root);
  2267.       var namePredicate = RDF.GetResource(gNC_NS + "Name");
  2268.       var toolbarName;
  2269.       /* rename the current folder. */
  2270.       BMDS.Assert(
  2271.          currentToolbarFolder, namePredicate, RDF.GetLiteral("temp"), true);
  2272.       /* get the folder name from the backup. */
  2273.       var backupAsString = ybookmarksUtils.fileContentsAsString(backup.path);
  2274.       var reMatch = Y_TOOLBAR_FOLDER_RE.exec(backupAsString);
  2275.       
  2276.       if (reMatch && reMatch[1]) {
  2277.          toolbarName = reMatch[1];
  2278.       }
  2279.       
  2280.       var toolbarNameLiteral = RDF.GetLiteral(toolbarName);
  2281.       /* and point the toolbar folder in the right direction. */
  2282.       var newToolbarFolder = 
  2283.          BMDS.GetSource(namePredicate, toolbarNameLiteral, true);
  2284.       var newTFSelection =
  2285.          BookmarksUtils.getSelectionFromResource(newToolbarFolder, root);
  2286.       BookmarksController.doCommand(
  2287.          "cmd_bm_setpersonaltoolbarfolder", newTFSelection);
  2288.       /* finally, delete the original toolbar folder. */
  2289.       BookmarksController.doCommand("cmd_delete", currentTFSelection);
  2290.       BookmarksUtils.flushDataSource();
  2291. }
  2292.  
  2293. function yb_restoreBookmarksToPlaces(backup) {
  2294.     try {
  2295.         yDebug.print("ybookmarksOverlay.js::yb_restoreBookmarksToPlaces:: restore bookmarks started", YB_LOG_MESSAGE);
  2296.         
  2297.         try {
  2298.               var historyService = Components.classes["@mozilla.org/browser/nav-history-service;1"]
  2299.                                    .getService(Components.interfaces.nsINavHistoryService);
  2300.             var options = historyService.getNewQueryOptions();
  2301.             var query = historyService.getNewQuery();
  2302.             
  2303.             var bookmarksService = Components.classes["@mozilla.org/browser/nav-bookmarks-service;1"]
  2304.                                              .getService(Components.interfaces.nsINavBookmarksService);
  2305.             
  2306.             //comment out the next line for now; the bug hasn't been fixed; final version should include the next line
  2307.             //options.setGroupingMode([options.GROUP_BY_FOLDER],1);
  2308.             query.setFolders([bookmarksService.bookmarksMenuFolder], 1);
  2309.             
  2310.             var result = historyService.executeQuery(query, options);
  2311.             var rootNode = result.root;
  2312.             rootNode.containerOpen = true;
  2313.             yDebug.print("Child: " + rootNode.childCount, YB_LOG_MESSAGE);
  2314.             // iterate over the immediate children of this folder and dump to console
  2315.             for (var i = 0; i < rootNode.childCount; i ++) {
  2316.               var node = rootNode.getChild(i);
  2317.               yDebug.print("Child: " + node.itemId+" uri: "+node.uri, YB_LOG_MESSAGE);
  2318.                 if(node.uri.indexOf("place:folder") == -1) bookmarksService.removeItem(node.itemId);
  2319.             }
  2320.             
  2321.             // close a container after using it!
  2322.             rootNode.containerOpen = false;
  2323.         }
  2324.         catch(e) {
  2325.             yDebug.print("ybookmarksOverlay.js::yb_restoreBookmarksToPlaces:: Exception - "+e, YB_LOG_MESSAGE);
  2326.         }
  2327.         
  2328.         /**
  2329.          * Hide sidebar
  2330.          */
  2331.         var sidebar = document.getElementById("sidebar-box");
  2332.         if (!sidebar.hidden) {
  2333.             toggleSidebar('viewYBookmarksSidebar', false);
  2334.         }
  2335.         
  2336.         yDebug.print("ybookmarksOverlay.js::yb_restoreBookmarksToPlaces:: deleted all the automatically imported bookmarks from bookmarks.html", YB_LOG_MESSAGE);
  2337.                 
  2338.         /**
  2339.          * Delete extra.rdf
  2340.          */
  2341.         var ds = Components.classes["@mozilla.org/file/directory_service;1"].
  2342.             createInstance(Components.interfaces.nsIProperties);
  2343.         var extraFile = ds.get("ProfD", Components.interfaces.nsIFile);
  2344.         extraFile.append("extra.rdf");
  2345.         if (extraFile.exists()) {
  2346.             extraFile.remove(false);
  2347.         }     
  2348.         //in case the file is not deleted
  2349.         var localStoreService = Components.classes["@mozilla.org/ybookmarks-store-service;1"].
  2350.                 getService(Components.interfaces.nsIYBookmarksStoreService);                          
  2351.         localStoreService.setLastUpdateTime("-1");
  2352.         
  2353.         yDebug.print("ybookmarksOverlay.js::yb_restoreBookmarksToPlaces:: removed extra.rdf", YB_LOG_MESSAGE);
  2354.         
  2355.         /**
  2356.          * Import bookmarks from backup file
  2357.          */
  2358.         var dirService = 
  2359.             ( Components.classes[ "@mozilla.org/file/directory_service;1" ] ).getService( 
  2360.                 Components.interfaces.nsIProperties );
  2361.         var aFile = 
  2362.             dirService.get( "ProfD", Components.interfaces.nsILocalFile );
  2363.         aFile.append( "bk_bookmarks.html" );
  2364.         if( aFile.exists() ) {
  2365.             var importer = Cc["@mozilla.org/browser/places/import-export-service;1"].
  2366.                        getService(Ci.nsIPlacesImportExportService);
  2367.             importer.importHTMLFromFile(aFile, true);
  2368.         }
  2369.            yDebug.print("ybookmarksOverlay.js::yb_restoreBookmarksToPlaces:: bookmarks imported from bookmarks_bk", YB_LOG_MESSAGE);
  2370.     }
  2371.     catch(e) { 
  2372.         yDebug.print("ybookmarksOverlay.js::yb_restoreBookmarksToPlaces::Exception: "+e, YB_LOG_MESSAGE);
  2373.     }
  2374.     
  2375. }
  2376.  
  2377. var YbookmarkUpdateObserver = {
  2378.  
  2379.   _total: null,
  2380.   _prevdone: 0,
  2381.   _chunk: 0,
  2382.   _done: 0,
  2383.   __timer: null,
  2384.   _failCount: 0,
  2385.   _maxFailures: -1,
  2386.   
  2387.   get _timer() {
  2388.     if ( !this.__timer ) {
  2389.       this.__timer = Components.classes["@mozilla.org/timer;1"].createInstance( Components.interfaces.nsITimer );
  2390.     }
  2391.     return this.__timer;
  2392.   },
  2393.   _pgrMeter: null,
  2394.  
  2395.   notify: function(aTimer) {
  2396.     if ( !this._pgrMeter )
  2397.       this._pgrMeter = document.getElementById("ybookmark-progressmeter" ),
  2398.  
  2399.     this._pgrMeter.value = ( this._prevdone * 100 ) / this._total;
  2400.     this._prevdone += 2;
  2401.   }, 
  2402.  
  2403.   observe: function ( subject, topic, data ) {
  2404.     try {
  2405.     var pgrText = document.getElementById("ybookmark-progresstext" );
  2406.     var pgrMeter = document.getElementById("ybookmark-progressmeter" );
  2407.     var pgrStatus = document.getElementById("ybookmark-progress-statusbarpanel" );
  2408.     var strings = document.getElementById( "ybookmarks-strings" );
  2409.     if (! (pgrMeter)) {
  2410.       return;
  2411.     }
  2412.     if ( topic == "ybookmark.syncBegin" ) {
  2413.  
  2414.       if (data != "remove-bookmarks" && data != "remove-extra") {
  2415.          pgrStatus.collapsed = false;
  2416.          pgrText.collapsed = false;
  2417.          pgrMeter.collapsed = false;
  2418.          pgrMeter.value = "1";
  2419.          pgrText.value = strings.getString( "extensions.ybookmarks.statusbar.downloading" );
  2420.          this._total = null;
  2421.          this._done = 0;
  2422.        }
  2423.  
  2424.     } else if ( topic == "ybookmark.syncDone" ) {
  2425.  
  2426.       if ( data == "no-update" ) {
  2427.  
  2428.         pgrText.value = strings.getString( "extensions.ybookmarks.statusbar.downloaddone" );
  2429.         setTimeout( function() { pgrStatus.collapsed = true; pgrText.collapsed = true; pgrMeter.collapsed = true; }, 2000 );
  2430.  
  2431.       } else if ( data == "all-done" ) {
  2432.  
  2433.         this._timer.cancel();
  2434.         pgrMeter.value = "100";
  2435.         pgrText.value = strings.getString( "extensions.ybookmarks.statusbar.downloaddone" );
  2436.         setTimeout( function() { pgrStatus.collapsed = true; pgrText.collapsed = true; pgrMeter.collapsed = true; }, 2000 );
  2437.       } else if (data == "sync-aborted") {
  2438.             pgrMeter.value = "100";         
  2439.           var pgrText = document.getElementById("ybookmark-progresstext" );
  2440.           pgrText.value = strings.getString( "extensions.ybookmarks.statusbar.downloadfail" );
  2441.           pgrText.collapsed = false;
  2442.           
  2443.           pgrStatus.collapsed = false;
  2444.           pgrText.collapsed = false;
  2445.           pgrMeter.collapsed = false;
  2446.           setTimeout( function() { pgrStatus.collapsed = true; pgrText.collapsed = true; pgrMeter.collapsed = true; }, 2000 );
  2447.       } else if (data == "sync-error") {
  2448.         this._failCount++;
  2449.         
  2450.         yDebug.print("Sync failed. Attempt #" + this._failCount);
  2451.         
  2452.         if (this._maxFailures == -1) {
  2453.           this._maxFailures =
  2454.             ybookmarksMain.prefs.getIntPref(
  2455.               "extensions.ybookmarks@yahoo.sync.attempts");
  2456.         }
  2457.         
  2458.         if (this._failCount < this._maxFailures) {
  2459.           this._timer.cancel();
  2460.           pgrMeter.value = "1";
  2461.           setTimeout( function() { ybookmarksMain.syncservice.sync(false); }, Y_SYNC_ATTEMPT_WAIT );
  2462.         } else {
  2463.           yDebug.print("Syncing failed repeatedly. Aborting");
  2464.           this._timer.cancel();
  2465.           pgrMeter.value = "100";
  2466.           pgrText.value = strings.getString( "extensions.ybookmarks.statusbar.downloadfail" );
  2467.           pgrStatus.collapsed = false;
  2468.           pgrText.collapsed = false;
  2469.           pgrMeter.collapsed = false;
  2470.           setTimeout( function() { pgrStatus.collapsed = true; pgrText.collapsed = true; pgrMeter.collapsed = true; }, 2000 );
  2471.         }
  2472.       }
  2473.       
  2474.     } else if ( topic == "ybookmark.syncInfo" ) {
  2475.       
  2476.       if ( data == "add-to-ds-begin" ) {
  2477.         if ( this._total ) {
  2478.           var mid = ( this._prevdone +  this._chunk / 2 );
  2479.           var value = (( 100 * mid ) / this._total);
  2480.           pgrMeter.value = value; 
  2481.         }
  2482.  
  2483.       }  else if ( data == "add-to-ds-end" ) {
  2484.             if ( this._total ) {
  2485.               this._timer.cancel();
  2486.               var value = (( 100 * this._done ) / this._total);
  2487.               pgrMeter.value = value; 
  2488.             }
  2489.             
  2490.       } else if ( data == "more-chunk" ) {
  2491.  
  2492.         pgrMeter.collapsed = false;
  2493.         // subject has first and chunk element assigned to it
  2494.         if ( subject && subject.wrappedJSObject ) {
  2495.           subject = subject.wrappedJSObject;
  2496.         }
  2497.  
  2498.         if ( !subject ) {
  2499.           return;
  2500.         }
  2501.  
  2502.         this._timer.cancel();
  2503.         this._total = subject.total;
  2504.         this._chunk = subject.chunk;
  2505.         this._prevdone = this._done;
  2506.         this._done += subject.chunk;
  2507.         this._timer.initWithCallback( this, 100, Components.interfaces.nsITimer.TYPE_REPEATING_SLACK );
  2508.       } 
  2509.       
  2510.     } else if (topic == "ybookmark.forceRefresh") {    
  2511.         if (window == ybookmarksUtils.getTopWindow()) {
  2512.           setTimeout(ybookmarksMain.forceRefresh, 500);        
  2513.         }
  2514.     }
  2515.   } catch (e) {
  2516.     yDebug.print("YbookmarkUpdateObserver.observe(" + subject + ", " + topic + ", " + data + "): " + e, YB_LOG_MESSAGE);
  2517.   }
  2518.   }
  2519. };
  2520.  
  2521. /*function ybBookmarkMenuUpdater(menuElement) {
  2522.   this._menu = menuElement;
  2523.   return this;
  2524. }
  2525.  
  2526. ybBookmarkMenuUpdater.prototype = {
  2527.  
  2528.   _updateMenus: function() {
  2529.     ybookmarksMain.isBookmarkChanged = 
  2530.         ybookmarksMain._is_recent_menu_update_required =
  2531.                 ybookmarksMain._is_frequent_menu_update_required = 
  2532.                   ybookmarksMain._is_recently_saved_menu_update_required = true;
  2533.     
  2534. //    ybookmarks_Main.addBookmarksToPopup( 
  2535. //                      document.getElementById( "ybookmarks_rc_visited_pop" ),
  2536. //                      "bookmark-sort-tree-visitdate-col" );
  2537. //    ybookmarks_Main.addBookmarksToPopup( 
  2538. //                      document.getElementById( "ybookmarks_fr_visited_pop" ),
  2539. //                      "bookmark-sort-tree-visitcount-col" );
  2540. //
  2541. //    ybookmarks_Main.addBookmarkItemsToMainMenu();
  2542.     
  2543.   },
  2544.  
  2545.   observe: function ( aSubject, aTopic, aData ) {
  2546.  
  2547.     if ( aTopic == "ybookmark.syncBegin" ) {
  2548.     } else if (aTopic == "ybookmark.syncDone") {
  2549.        switch (aData) {
  2550.          case "all-done":
  2551.          case "sync-error":
  2552.            this._updateMenus();
  2553.            ybookmarksMain.isChangingDatasource = false;
  2554.            break;
  2555.          case "add-to-ds-begin":
  2556.            ybookmarksMain.isChangingDatasource = true;
  2557.            break;
  2558.          case "add-to-ds-end":
  2559.            ybookmarksMain.isChangingDatasource = false;
  2560.            ybookmarksMain.rebuildTagsMenu();
  2561.            break;
  2562.          case "more-chunk":
  2563.          case "no-update":
  2564.            break;
  2565.        }
  2566.     }
  2567.   },
  2568.  
  2569.   onAssert: function(aDatasource, aSource, aPredicate, aTarget) {
  2570.     //yDebug.print ( "onAssert => " + aPredicate.Value );
  2571.     this._setCommonFlags( aDatasource, aPredicate );
  2572.   },
  2573.  
  2574.   onBeginUpdateBatch: function(aDatasource) {
  2575.   },
  2576.  
  2577.   onChange: function(aDatasource, aSource, aPredicate, aOldTarget, aNewTarget ) { 
  2578.  
  2579.     aPredicate.QueryInterface ( Components.interfaces.nsIRDFResource );
  2580.     if ( aPredicate.EqualsNode( gYBrscName ) || aPredicate.EqualsNode( gYBrscGenTitle ) ) {
  2581.       ybookmarksMain.isBookmarkChanged = true;
  2582.     }
  2583.  
  2584.     if ( aPredicate.EqualsNode( gYBrscVisitCount ) && !aOldTarget.EqualsNode( aNewTarget ) ) {
  2585.       yDebug.print ( "Most frequent flag changed" );
  2586.       ybookmarksMain._is_frequent_menu_update_required = true;
  2587.     }
  2588.  
  2589.     if ( aPredicate.EqualsNode( gYBrscLastVisitDate ) && !aOldTarget.EqualsNode ( aNewTarget ) ) {
  2590.       yDebug.print ( "Most recent flag changed" );
  2591.       ybookmarksMain._is_recent_menu_update_required = true;
  2592.       ybookmarksMain.isBookmarkChanged = true;
  2593.  
  2594.       // change the most visited count here
  2595.       var bookmark = ybookmarksMain.gBookmarks.getBookmarkFromResource ( aSource );
  2596.       if ( bookmark ) {
  2597.         ybookmarksMain.gBookmarks.incrementVisitCount ( bookmark.url );
  2598.       }
  2599.     }
  2600.   },
  2601.  
  2602.   onEndUpdateBatch: function(aDatasource) { 
  2603.     //yDebug.print ( "End of batch update" );
  2604.   },
  2605.  
  2606.   onMove: function(aDatasource, aOldSource, aNewSource, aPredicate, aTarget) { 
  2607.   },
  2608.  
  2609.   onUnassert: function(aDatasource, aSource, aPredicate, aTarget) { 
  2610.     //yDebug.print ( "onUnassert => " + aPredicate.Value );
  2611.     this._setCommonFlags( aDatasource, aPredicate );
  2612.   },
  2613.  
  2614.   _setCommonFlags: function(aDatasource, aPredicate ) {
  2615.     if (aPredicate.EqualsNode( gYBrscTagValue ) ) {
  2616.       ybookmarksMain.isNewTagAdded = true;
  2617.     } else if ( aPredicate.EqualsNode( gYBrscUrl ) ) {
  2618.       ybookmarksMain.isBookmarkChanged = true;
  2619.       //for adding and deleting bookmarks, just in case the bookmarks are on these menus
  2620.       ybookmarksMain._is_frequent_menu_update_required = true;
  2621.       ybookmarksMain._is_recent_menu_update_required = true;
  2622.       ybookmarksMain._is_recently_saved_menu_update_required = true;
  2623.     } else if ( aPredicate.EqualsNode( gYBrscTag ) ) {
  2624.       ybookmarksMain.isBookmarkChanged = true;
  2625.     }
  2626.   }
  2627. };
  2628. */
  2629. /**
  2630.  * Object that observes the extension manager for any changes in the state of
  2631.  * an extension. It's used to detect when this extension is being uninstalled
  2632.  * or disabled by the user.
  2633.  */
  2634. var yUninstallObserver = {
  2635.    /* indicates whether the extension is set to be uninstalled. */
  2636.    _uninstall : false,
  2637.    /* cached copy of the bookmarks store. */
  2638.    _bmStore: null,
  2639.   
  2640.    /**
  2641.     * Observes any changes in a particular "topic". In this case we're observing
  2642.     * changes in the extension manager and closing the application.
  2643.     * @param subject the object that experienced the change.
  2644.     * @param topic the topic being observed.
  2645.     * @param data the data relating to the change.
  2646.     */
  2647.    observe : function(subject, topic, data) {
  2648.       var wm =
  2649.          Components.classes["@mozilla.org/appshell/window-mediator;1"].
  2650.             getService(Components.interfaces.nsIWindowMediator);
  2651.       var winEnumerator = wm.getEnumerator("navigator:browser");
  2652.       /* this guarantees that having multiple windows won't cause problems. */
  2653.       var isFirstWindow = (winEnumerator.getNext() == window);
  2654.    
  2655.       if (topic == "em-action-requested" && isFirstWindow) {
  2656.          subject.QueryInterface(Components.interfaces.nsIUpdateItem);
  2657.  
  2658.          if (subject.id == YBOOKMARKS_ID) {
  2659.             if (data == "item-uninstalled") {
  2660.                 this._uninstall = true;
  2661.                 var syncService = Components.classes[Y_kSyncServiceContractID].
  2662.                     getService(Components.interfaces.nsIYBookmarkSyncService);
  2663.                 syncService.cancelSync();
  2664.             } else if (data == "item-cancel-action") {
  2665.                /* uninstall and disable may be cancelled by selecting "Enable"
  2666.                   from the context menu. */
  2667.                this._uninstall = false;
  2668.             }
  2669.          }
  2670.       } else if (topic == "quit-application-granted") {
  2671.          if (this._uninstall) {
  2672.             /* unset all preferences we won't need later. */
  2673.             var count = {value: 0};
  2674.             var prefsToClean = 
  2675.                ybookmarksMain.prefs.getChildList(
  2676.                   "extensions.ybookmarks@yahoo", count);
  2677.             
  2678.             for (var i = 0; i < count.value; i++) {
  2679.                if(ybookmarksMain.prefs.prefHasUserValue(prefsToClean[i])) {
  2680.                   ybookmarksMain.prefs.clearUserPref(prefsToClean[i]);
  2681.                }
  2682.             }
  2683.          }
  2684.          
  2685.          this.unregister();
  2686.       }
  2687.    },
  2688.       
  2689.    /**
  2690.     * Registers the observer to check for extension update and application exit
  2691.     * events.
  2692.     * @strings string bundle used for the dialog.
  2693.     */
  2694.    register: function() {
  2695.       var observerService = 
  2696.          Components.classes["@mozilla.org/observer-service;1"].
  2697.             getService(Components.interfaces.nsIObserverService);
  2698.  
  2699.       observerService.addObserver(this, "em-action-requested", false);
  2700.       observerService.addObserver(this, "quit-application-granted", false);
  2701.    },
  2702.  
  2703.    /**
  2704.     * Unregisters the observer.
  2705.     */
  2706.    unregister: function() {
  2707.       var observerService = 
  2708.         Components.classes["@mozilla.org/observer-service;1"].
  2709.            getService(Components.interfaces.nsIObserverService);
  2710.   
  2711.       observerService.removeObserver(this,"em-action-requested");
  2712.       observerService.removeObserver(this,"quit-application-granted");
  2713.    }
  2714. };
  2715.  
  2716. var ybInfoPanel = {
  2717.   _storeService: null,
  2718.   _bookmarkRdfObserver: null,
  2719.   
  2720.   register: function() {
  2721.     var infoIcon = document.getElementById("yb-statusbar-infopanel-icon");
  2722.     infoIcon.addEventListener("click", ybInfoPanel.infoOnClick, true);
  2723.     
  2724.     // TODO: we should actually use http://www.xulplanet.com/references/xpcomref/ifaces/nsIWebProgressListener.html
  2725.     // to support checking this BEFORE the page is loaded
  2726.     window.addEventListener("pageshow", ybInfoPanel.onPageShow, true);
  2727.     window.addEventListener("pagehide", ybInfoPanel.onPageHide, true);
  2728.     
  2729.     var tabBrowser = document.getElementById("content");
  2730.     tabBrowser.addEventListener("select", ybInfoPanel.onPageShow, true);
  2731.   
  2732.     this._bookmarkRdfObserver = {
  2733.  
  2734.       _ybInfoPanel: this,
  2735.       _shouldUpdate : false,
  2736.       _syncing : false,
  2737.  
  2738.       _update : function () {
  2739.         //fixed scope problem
  2740.         if (this != ybInfoPanel._bookmarkRdfObserver) {
  2741.           ybInfoPanel._bookmarkRdfObserver._update();  
  2742.         }
  2743.  
  2744.         if (this._shouldUpdate) {
  2745.           if (this._syncing) {
  2746.             setTimeout(this._update, 2000);          
  2747.             return;
  2748.           }
  2749.  
  2750.           this._shouldUpdate = false;
  2751.           this._ybInfoPanel.onPageShow();
  2752.         }
  2753.       },
  2754.  
  2755.       observe: function ( aSubject, aTopic, aData ) {
  2756.             if ( aTopic == "ybookmark.syncBegin" ) {
  2757.               this._syncing = true;
  2758.     
  2759.             } else if ( aTopic == "ybookmark.syncDone" ) {
  2760.               this._syncing = false;
  2761.     
  2762.               if ( aData == "all-done" || aData == "add-to-ds-end" || aData == "remove-bookmarks" || aData == "remove-extra") {
  2763.                  this._ybInfoPanel.onPageShow();
  2764.               }
  2765.                
  2766.             } else if (aTopic == "ybookmark.syncInfo") {
  2767.               if ( aData =="more-chunk" ) {
  2768.                 // probably wait for whole update to finish
  2769.               }
  2770.             }
  2771.  
  2772.       },
  2773.  
  2774.       onAssert: function(aDatasource, aSource, aPredicate, aTarget) {        
  2775.         if (this._syncing && this._shouldUpdate) {
  2776.           return;
  2777.         }
  2778.  
  2779.         //do it when a tag is added to a bookmark
  2780.         if ( aPredicate.EqualsNode( gYBrscUrl ) ) {
  2781.           aTarget.QueryInterface(Components.interfaces.nsIRDFLiteral);
  2782.           if (aTarget.Value == window.content.document.location) {
  2783.               this._shouldUpdate = true;
  2784.               setTimeout(this._update, 0);
  2785.           }          
  2786.         }
  2787.       },
  2788.  
  2789.       onBeginUpdateBatch: function(aDatasource) {
  2790.       },
  2791.  
  2792.       onChange: function(aDatasource, aSource, aPredicate, aOldTarget, aNewTarget ) {
  2793.       },
  2794.  
  2795.       onEndUpdateBatch: function(aDatasource) { 
  2796.       },
  2797.  
  2798.       onMove: function(aDatasource, aOldSource, aNewSource, aPredicate, aTarget) { 
  2799.       },
  2800.  
  2801.       onUnassert: function(aDatasource, aSource, aPredicate, aTarget) { 
  2802.  
  2803.         if (this._syncing && this._shouldUpdate) {
  2804.           return;
  2805.         }
  2806.         if ( aPredicate.EqualsNode( gYBrscUrl )) {
  2807.           aTarget.QueryInterface(Components.interfaces.nsIRDFLiteral);
  2808.           if (aTarget.Value == window.content.document.location) {
  2809.               this._shouldUpdate = true;
  2810.               setTimeout(this._update, 0);
  2811.           }
  2812.         }
  2813.       }
  2814.     };
  2815.         
  2816.     var os = Components.classes["@mozilla.org/observer-service;1"]
  2817.                                      .getService(Components.interfaces.nsIObserverService);
  2818.     os.addObserver ( this._bookmarkRdfObserver, "ybookmark.syncBegin", false );
  2819.     os.addObserver ( this._bookmarkRdfObserver, "ybookmark.syncInfo", false );
  2820.     os.addObserver ( this._bookmarkRdfObserver, "ybookmark.syncDone", false );    
  2821.  
  2822.     this._storeService = Components.classes["@mozilla.org/ybookmarks-store-service;1"].
  2823.       getService(Components.interfaces.nsIYBookmarksStoreService);
  2824.     this._storeService.getDataSource().AddObserver( this._bookmarkRdfObserver );
  2825.     
  2826.   },
  2827.   
  2828.   unregister: function() {
  2829.     try {
  2830.       window.removeEventListener("pageshow", ybInfoPanel.onPageShow, true);
  2831.       window.removeEventListener("pagehide", ybInfoPanel.onPageHide, true);
  2832.     } catch ( e ) { 
  2833.       yDebug.print("ybInfoPanel.unregister():" + e);
  2834.     }
  2835.     
  2836.     try {
  2837.       var tabBrowser = document.getElementById("content");
  2838.       tabBrowser.removeEventListener("select", ybInfoPanel.onPageShow, true);
  2839.     } catch ( e ) { 
  2840.       yDebug.print("ybInfoPanel.unregister():" + e);
  2841.     }
  2842.  
  2843.     try {
  2844.       var infoIcon = document.getElementById("yb-statusbar-infopanel-icon");
  2845.       infoIcon.removeEventListener("click", ybInfoPanel.infoOnClick, true);
  2846.     } catch ( e ) { 
  2847.       yDebug.print("ybInfoPanel.unregister():" + e);
  2848.     }
  2849.     
  2850.     try {
  2851.       this._storeService.getDataSource().RemoveObserver( this._bookmarkRdfObserver );
  2852.     } catch ( e ) { 
  2853.       yDebug.print("ybInfoPanel.unregister():" + e);
  2854.     }
  2855.     
  2856.     try {
  2857.       var os = Components.classes["@mozilla.org/observer-service;1"]
  2858.                                        .getService(Components.interfaces.nsIObserverService);
  2859.  
  2860.       os.removeObserver ( this._bookmarkRdfObserver, "ybookmark.syncDone" );
  2861.       os.removeObserver ( this._bookmarkRdfObserver, "ybookmark.syncInfo" );
  2862.       os.removeObserver ( this._bookmarkRdfObserver, "ybookmark.syncBegin" );
  2863.     } catch ( e ) { 
  2864.       yDebug.print("ybInfoPanel.unregister():" + e);
  2865.     }
  2866.  
  2867.   },
  2868.   
  2869.   
  2870.   onPageShow: function(event) {
  2871.     try {
  2872.       if (!window.content) { return; }    
  2873.       var url = window.content.document.location;
  2874.       if (!url) { return; }
  2875.     
  2876.       var storeService = Components.classes["@mozilla.org/ybookmarks-store-service;1"].
  2877.           getService(Components.interfaces.nsIYBookmarksStoreService);
  2878.       var bookmark = storeService.isBookmarked(url);
  2879.       var infoPanel = document.getElementById("yb-statusbar-infopanel");
  2880.       var infoIcon = document.getElementById("yb-statusbar-infopanel-icon");
  2881.  
  2882.       if (bookmark) {
  2883.         var strings = document.getElementById("ybookmarks-strings");
  2884.         infoPanel.setAttribute("collapsed", false);       
  2885.         infoIcon.setAttribute("collapsed", false);
  2886.         infoIcon.setAttribute("url", url);
  2887.       } else {
  2888.         infoPanel.setAttribute("collapsed", true);       
  2889.         infoIcon.setAttribute("collapsed", true);       
  2890.       }
  2891.     } catch (e) { 
  2892.       yDebug.print("ybInfoPanel.onPageShow(): " + e);   
  2893.     }
  2894.   },
  2895.  
  2896.   onPageHide: function(event) {
  2897.     try {
  2898.       if (window.content && event.target == window.content.document) { 
  2899.         var infoPanel = document.getElementById("yb-statusbar-infopanel");
  2900.         var infoIcon = document.getElementById("yb-statusbar-infopanel-icon");
  2901.         infoPanel.setAttribute("collapsed", true);
  2902.         infoIcon.setAttribute("collapsed", true);
  2903.       }
  2904.     } catch(e) { 
  2905.       yDebug.print("ybInfoPanel.onPageHide():" + e);
  2906.     }
  2907.   },
  2908.   
  2909.   infoOnClick: function (event) {
  2910.     var mouseClick = (event.button == 1) ? true : false;
  2911.     ybookmarksMain.loadRelevantPage(event, 'moreabout', mouseClick);
  2912.   },
  2913.   
  2914.   onTooltipShowing: function() {
  2915.     try {
  2916.       var url = document.getElementById("yb-statusbar-infopanel-icon").getAttribute("url");
  2917.       if (!url) { return; }
  2918.     
  2919.       var tags = document.getElementById("yb-statusbar-infopanel-tooltip-tags");
  2920.       var lastModified = document.getElementById("yb-statusbar-infopanel-tooltip-lastmodified");
  2921.       var notShared = document.getElementById("yb-statusbar-infopanel-tooltip-notshared");
  2922.       var notes = document.getElementById("yb-statusbar-infopanel-tooltip-notes");
  2923.       var notesLabel = document.getElementById("yb-statusbar-infopanel-tooltip-notes-label");
  2924.    
  2925.       var bookmark = Components.classes["@mozilla.org/ybookmarks-store-service;1"].
  2926.               getService(Components.interfaces.nsIYBookmarksStoreService).getBookmark(url);
  2927.       var strings = document.getElementById("ybookmarks-strings");
  2928.     
  2929.       var tagsEnum = bookmark.tags.enumerate();
  2930.       var jsTags = [];    
  2931.       while( tagsEnum.hasMoreElements() ) {
  2932.         jsTags.push( (tagsEnum.getNext().QueryInterface( Components.interfaces.nsISupportsString ) ).data);
  2933.       }
  2934.    
  2935.       tags.setAttribute("value", jsTags.join(" "));
  2936.  
  2937.       lastModified.setAttribute("value", ybookmarksUtils.usecToUIString(bookmark.last_modified));
  2938.       if (bookmark.description) {
  2939.         notes.setAttribute("value", bookmark.description);
  2940.         notes.setAttribute("hidden", false);
  2941.         notesLabel.setAttribute("hidden", false);
  2942.       } else {
  2943.         notes.setAttribute("hidden", true);        
  2944.         notesLabel.setAttribute("hidden", true);        
  2945.       }
  2946.       //notes.appendChild(document.createTextNode(bookmark.description));
  2947.       
  2948.       if (bookmark.shared == "true") {
  2949.         notShared.setAttribute("hidden", true);
  2950.       } else {
  2951.         notShared.setAttribute("hidden", false);
  2952.       }
  2953.       
  2954.    } catch(e) { 
  2955.      yDebug.print("tbInfoPanel.onTooltipShowing(): " + e);
  2956.    }
  2957.  }
  2958.   
  2959. };
  2960.  
  2961. var ybUserInterface = {
  2962.   
  2963.   _prefs: null,
  2964.   _strings: null,
  2965.   
  2966.   register: function(attribute){
  2967.     this._prefs = Components.classes["@mozilla.org/preferences-service;1"]
  2968.                     .getService(Components.interfaces.nsIPrefBranch);
  2969.     this._prefs.QueryInterface(Components.interfaces.nsIPrefBranch2);
  2970.     this._prefs.addObserver("extensions.ybookmarks@yahoo.original", this.prefsObserver, false);
  2971.     
  2972.     this._strings = document.getElementById( "ybookmarks-strings" );
  2973.   },
  2974.   
  2975.   unregister: function(attribute){
  2976.     this._prefs.removeObserver("extensions.ybookmarks@yahoo.original", this.prefsObserver);
  2977.   },
  2978.   
  2979.   prefsObserver: {
  2980.     observe : function(subject, topic, data) {
  2981.       if (data == "extensions.ybookmarks@yahoo.original.ui.hide") {
  2982.         var hideUI = ybUserInterface._prefs.getBoolPref("extensions.ybookmarks@yahoo.original.ui.hide");
  2983.         var remap = ybUserInterface._prefs.getBoolPref("extensions.ybookmarks@yahoo.original.keybindings.remap");
  2984.   
  2985.         ybUserInterface.tweakBookmarksUI(hideUI);
  2986.         ybUserInterface.tweakKeyBindings(remap);
  2987.       } else if (data == "extensions.ybookmarks@yahoo.original.keybindings.remap") {
  2988.         var remap = ybUserInterface._prefs.getBoolPref("extensions.ybookmarks@yahoo.original.keybindings.remap");
  2989.         ybUserInterface.tweakKeyBindings(remap);
  2990.       }
  2991.     }
  2992.   },
  2993.   
  2994.   setHideUI: function (hide) {
  2995.     hide = hide ? true : false;
  2996.     this._prefs.setBoolPref("extensions.ybookmarks@yahoo.original.ui.hide", hide);
  2997.   },
  2998.   
  2999.   setRemapKeyBindings: function(remap) {
  3000.     remap = remap ? true : false;
  3001.     this._prefs.setBoolPref("extensions.ybookmarks@yahoo.original.keybindings.remap", remap);    
  3002.   },
  3003.     
  3004.   /*
  3005.    * Currently, we keep the "intended" bindings for add and sidebar in the locale files.  
  3006.    * We then backup and keybindings with yb_backup_*.  The secondary bindings are kept in
  3007.    * the preferences
  3008.    */
  3009.   tweakKeyBindings: function(remap) {    
  3010.     try {
  3011.       var keyOrigAddBookmark = document.getElementById("addBookmarkAsKb");
  3012.       var keyOrigSidebar = document.getElementById("viewBookmarksSidebarKb");
  3013.  
  3014.       var keyDelAddBookmark = document.getElementById("addYBookmarkAsKb");
  3015.       var keyDelSidebar = document.getElementById("key_openYBookmarksSidebar");
  3016.       
  3017.       var secAddKey = this._prefs.getCharPref("extensions.ybookmarks@yahoo.original.keybindings.remap.secondary.add.key");
  3018.       var secAddModifiers = this._prefs.getCharPref("extensions.ybookmarks@yahoo.original.keybindings.remap.secondary.add.modifiers");
  3019.       var secSidebarKey = this._prefs.getCharPref("extensions.ybookmarks@yahoo.original.keybindings.remap.secondary.sidebar.key");
  3020.       var secSidebarModifiers = this._prefs.getCharPref("extensions.ybookmarks@yahoo.original.keybindings.remap.secondary.sidebar.modifiers");
  3021.  
  3022.       if (!keyDelSidebar) { return; }
  3023.  
  3024.       var hideUI = this._prefs.getBoolPref("extensions.ybookmarks@yahoo.original.ui.hide");
  3025.     
  3026.       var safeBackup = function(elt, attrname) {
  3027.         var backup_attr = elt.getAttribute("yb_backup_" + attrname);
  3028.         if (!backup_attr) {
  3029.           elt.setAttribute("yb_backup_" + attrname, elt.getAttribute("attrname"));
  3030.         }
  3031.       };
  3032.       
  3033.       var safeRestore = function (elt, attrname) {
  3034.         var backup_attr = elt.getAttribute("yb_backup_" + attrname);
  3035.         if (backup_attr) {
  3036.           elt.setAttribute(attrname, backup_attr);
  3037.           return true;
  3038.         }
  3039.         return false;
  3040.       };
  3041.       
  3042.       var safeSetKeybinding = function (key, secAddKey, secAddModifiers) {
  3043.         if(!secAddKey) {
  3044.           secAddKey = "\n";  // bad hack. hope this doesn't break anything. "" is the famous "any Key"
  3045.         } 
  3046.         safeBackup(key, "key");
  3047.         safeBackup(key, "modifiers");
  3048.         key.setAttribute("key", secAddKey);
  3049.         key.setAttribute("modifiers", secAddModifiers);
  3050.       };
  3051.           
  3052.       var safeResetKeybinding = function(key) {
  3053.         safeRestore(key, "key");
  3054.         safeRestore(key, "modifiers");
  3055.       };
  3056.       
  3057.         if (hideUI || remap) {
  3058.           safeResetKeybinding(keyDelSidebar);
  3059.           safeResetKeybinding(keyDelAddBookmark);    
  3060.           safeSetKeybinding(keyOrigAddBookmark, secAddKey, secAddModifiers);
  3061.           safeSetKeybinding(keyOrigSidebar, secSidebarKey, secSidebarModifiers);
  3062.           yDebug.print("Remapping keybindings");
  3063.     
  3064.         } else {
  3065.           safeResetKeybinding(keyOrigSidebar);
  3066.           safeResetKeybinding(keyOrigAddBookmark);
  3067.           safeSetKeybinding(keyDelAddBookmark, secAddKey, secAddModifiers);
  3068.           safeSetKeybinding(keyDelSidebar, secSidebarKey, secSidebarModifiers);
  3069.           yDebug.print("Not remapping keybindings"); 
  3070.         } 
  3071.     } catch (e) {
  3072.       yDebug.print("ybUserInterface.tweakKeyBindings():" + e);
  3073.     }
  3074.     
  3075.   },
  3076.   
  3077.   tweakBookmarksUI: function(hideUI) {
  3078.     //This is to work around a crash in Leopard.
  3079.     if(ybookmarksUtils.isOSXLeopard()) {    
  3080.        //Hide these menu items
  3081.        var showBookmarksMenu = document.getElementById("yb-broadcaster-bookmarksmenu-show");
  3082.        var hideBookmarksMenu = document.getElementById("yb-broadcaster-bookmarksmenu-hide");
  3083.        showBookmarksMenu.setAttribute("hidden", true);
  3084.        hideBookmarksMenu.setAttribute("hidden", true);
  3085.        return;
  3086.     }
  3087.     try {
  3088.      hideUI = hideUI ? true : false;
  3089.      
  3090.         if(ybookmarksUtils.getFFMajorVersion() > 2) {
  3091.           bookmarksMenuId = "bookmarksMenu";
  3092.           bookmarksMenuPopup = "bookmarksMenuPopup";
  3093.       }
  3094.       else {
  3095.           bookmarksMenuId = "bookmarks-menu";              
  3096.           bookmarksMenuPopup = "menu_BookmarksPopup";          
  3097.       }
  3098.  
  3099.      var bookmarksMenu = document.getElementById(bookmarksMenuId);
  3100.      if (bookmarksMenu) {
  3101.         //This has some problem in OSX Leopard
  3102.         bookmarksMenu.setAttribute('hidden', hideUI);
  3103.      }
  3104.      
  3105.      
  3106.     
  3107.     var frame = document.getElementById("frame");
  3108.     if (frame) {
  3109.     var frameMenu = frame.childNodes[0];
  3110.     var oldItem = frameMenu.childNodes[6]; // Bookmark This Frame...
  3111.       
  3112.       // hide the contentAreaContextMenu items
  3113.       // hidden and collapsed are necc because normal context menu functionality futzes with hidden
  3114.       var bmLink = document.getElementById("context-bookmarklink");
  3115.       bmLink.hidden = hideUI; 
  3116.       bmLink.collapsed = hideUI;
  3117.       var bmPage = document.getElementById("context-bookmarkpage");
  3118.       bmPage.hidden = hideUI;
  3119.       bmPage.collapsed = hideUI;
  3120.  
  3121.       oldItem.hidden = hideUI;
  3122.       oldItem.collapsed = hideUI;
  3123.  
  3124.       bmThisFrame = document.getElementById("yb_bookmark_this_frame_item");
  3125.       if (!bmThisFrame) {
  3126.         var bookmarkFrameItem = document.createElement("menuitem");
  3127.         bookmarkFrameItem.setAttribute("id", "yb_bookmark_this_frame_item");
  3128.         bookmarkFrameItem.setAttribute("label", this._strings.getString("extensions.ybookmarks.context.bookmark.frame"));
  3129.         bookmarkFrameItem.setAttribute("command", "cmd_yb_bookmark_this_frame");
  3130.         bookmarkFrameItem.setAttribute("class", "menuitem-iconic");
  3131.         bookmarkFrameItem.setAttribute("image", "chrome://ybookmarks/skin/delicious_context.png");
  3132.         frameMenu.insertBefore(bookmarkFrameItem, oldItem.nextSibling);
  3133.       }
  3134.       
  3135.     }
  3136.       //bookmarks menu
  3137.         var bookmarksMenuPopup = document.getElementById(bookmarksMenuPopup);
  3138.         if (!bookmarksMenuPopup.ybTweaked) {
  3139.           // we need to add and remove the items because of the bookmarks templates messes up the separator
  3140.         bookmarksMenuPopup.setAttribute("onpopupshowing", " if (event.target == this) { ybookmarksMain.onBookmarksMenuPopupShowing(event);}" + bookmarksMenuPopup.getAttribute("onpopupshowing"));
  3141.         bookmarksMenuPopup.ybTweaked = true;
  3142.       }
  3143.       
  3144.       var tabbrowser = getBrowser();
  3145.       var tabMenu = document.getAnonymousElementByAttribute(tabbrowser,"anonid","tabContextMenu");
  3146.       //Show/Hide Our Mainu Menu for Bookmarks "Show Bookmarks Menu" and "Hide Bookmarks Menu"
  3147.       //:::Classic mode doesnt need this.Coz we dont hide or show bookmarks menu.
  3148.         if(ybookmarksUtils.getExtensionMode() == YB_EXTENSION_MODE_STANDARD)  {         
  3149.           var showBookmarksMenu = document.getElementById("yb-broadcaster-bookmarksmenu-show");
  3150.           var hideBookmarksMenu = document.getElementById("yb-broadcaster-bookmarksmenu-hide");
  3151.           showBookmarksMenu.setAttribute("hidden", !hideUI);
  3152.           hideBookmarksMenu.setAttribute("hidden", hideUI);
  3153.         } 
  3154.       
  3155.       if (tabMenu && !tabMenu.ybTweaked) {        
  3156.         var insertPos = tabMenu.lastChild.previousSibling;
  3157.         var ffbmAll = null;
  3158.         var ffbmCur = null;                
  3159.         var tabContextMenuItem = insertPos.previousSibling;
  3160.         while(tabContextMenuItem && (!ffbmAll || !ffbmCur)) {
  3161.             if (tabContextMenuItem.getAttribute("command") == "Browser:BookmarkAllTabs") {
  3162.                 ffbmAll = tabContextMenuItem;
  3163.             } else if (tabContextMenuItem.getAttribute("oncommand") == "BookmarkThisTab();") {
  3164.                 ffbmCur = tabContextMenuItem;
  3165.             }
  3166.             tabContextMenuItem = tabContextMenuItem.previousSibling;            
  3167.         }
  3168.         
  3169.         if (ffbmAll) {
  3170.           ffbmAll.hidden = hideUI;
  3171.           ffbmAll.collapsed = hideUI;
  3172.         }
  3173.         if (ffbmCur) {
  3174.           ffbmCur.hidden = hideUI;
  3175.           ffbmCur.collapsed = hideUI;         
  3176.         }
  3177.         var hideYBContextMenu = false;
  3178.         try  {        
  3179.             hideYBContextMenu = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch).getBoolPref("extensions.ybookmarks@yahoo.contextmenu.hide");  
  3180.         } catch(e) {
  3181.             yDebug.print("Exception while accessing user preference:" + e);
  3182.         }
  3183.         //Adding our menu in the tabmenu
  3184.         if(!hideYBContextMenu) {          
  3185.             var bookmarkCurTabItem = document.createElement("menuitem");
  3186.             bookmarkCurTabItem.setAttribute("label", this._strings.getString("extensions.ybookmarks.context.bookmark.tab"));
  3187.             bookmarkCurTabItem.setAttribute("oncommand", "ybookmarksMain.bookmarkThisTab();");
  3188.             tabMenu.insertBefore(bookmarkCurTabItem, insertPos);
  3189.         }
  3190.         tabMenu.ybTweaked = true;
  3191.       }      
  3192.     } catch (e) {
  3193.       yDebug.print("ybUserInterface.tweakBookmarksUI(): " + e);
  3194.     }
  3195.    }, 
  3196.    
  3197.    switchToStandardMode: function() {
  3198.            var params = {out:null};
  3199.            window.openDialog("chrome://ybookmarks/content/switchToRegMode.xul", "", "chrome,dialog,centerscreen,modal,resizable=no", params);
  3200.            if(params.out) {               
  3201.                //set the mode pref value and restart.
  3202.             var pref = Components.classes["@mozilla.org/preferences-service;1"].
  3203.                      getService(Components.interfaces.nsIPrefBranch);
  3204.             pref.setCharPref("extensions.ybookmarks@yahoo.engine.set.mode", YB_EXTENSION_MODE_STANDARD);                
  3205.                ybookmarksUtils.restartBrowser();
  3206.            }
  3207.            return true;         
  3208.    }  
  3209. };
  3210.  
  3211. /* End - Add Bookmark Call Backs */
  3212. /* Helper functions */
  3213. function yb_onLoad(event) {
  3214.   try {
  3215.      ybookmarksMain.onLoad(event);
  3216.   } catch (e) {
  3217.      yDebug.print("Uncaught error during onload:" + e.message + (e.stack ? e.stack : ""), YB_LOG_MESSAGE);
  3218.      throw e;
  3219.   }
  3220. }
  3221.  
  3222. function yb_onUnload(event) {
  3223.   try {
  3224.      ybookmarksMain.onUnload(event);
  3225.   } catch (e) {
  3226.      yDebug.print("Uncaught error during unload:" + e.message + (e.stack ? e.stack : ""), YB_LOG_MESSAGE);
  3227.      throw e;
  3228.   }
  3229. }
  3230. /* End of Helper functions */
  3231.  
  3232. /**
  3233.  * Listner class for adress bar changes to provide data for tagometer
  3234.  */
  3235. var urlBarListenerFavIcon = {
  3236.   onLocationChange: function() {},
  3237.   onStateChange: function(aWebProgress, aRequest, aStateFlags, aStatus) {
  3238.     const nsIWebProgressListener = Components.interfaces.nsIWebProgressListener;
  3239.     if (aStateFlags & nsIWebProgressListener.STATE_STOP) {
  3240.       if (aStateFlags & nsIWebProgressListener.STATE_IS_NETWORK) {
  3241.         if (aWebProgress.DOMWindow == content) {
  3242.           var browser = gBrowser.mCurrentBrowser;
  3243.           if (!gBrowser.mTabbedMode && !browser.mIconURL)
  3244.             gBrowser.useDefaultIcon(gBrowser.mCurrentTab);
  3245.           if (browser.mIconURL) {
  3246.  
  3247.               gYB_loadFavIconNew(browser.currentURI.spec, browser.mIconURL);
  3248.  
  3249.           }
  3250.         }
  3251.       }      
  3252.     }      
  3253.   },
  3254.   onProgressChange: function() {},
  3255.   onStatusChange: function() {},
  3256.   onSecurityChange: function() {},
  3257.   onLinkIconAvailable: function() {}
  3258. };
  3259.  
  3260. window.addEventListener("load",
  3261.                           yb_onLoad,
  3262.                           false);
  3263. window.addEventListener("unload",
  3264.                           yb_onUnload,
  3265.                           false);
  3266.  
  3267.  
  3268.